這是我在藍色小舖看見的問題,我想初學者應該會卡住,所以順手寫了解答給大家參考。

http://www.blueshop.com.tw/board/show.asp?subcde=BRD20081116162920FFF&fumcde=FUM20041006161839LRJ&rplcnt=0

他要作的東西也很簡單,就是透過 CheckBoxList挑選條件,然後搜尋到的資料,呈現在GridView上面。(如下圖)

------------------------------------------------------------------------------------------------------

這位發問者,看起來程度已經不錯,對於SqlDataSource的設定已經很純熟,

但為何會遇見問題呢?

 

原因就在於:他要用 CheckBoxList來作搜尋的條件,而 CheckBoxList是用來作「複選」的。

偏偏 SqlDataSource的設定參數(直接在精靈畫面上,一步一步地設定),只能使用單一值來作。

複選的答案就不行囉!

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
        SelectCommand="SELECT [test_time], [id], [class], [title] FROM [test] WHERE ([class] LIKE '%' + @class + '%')">
        <SelectParameters>
            <asp:ControlParameter ControlID="CheckBoxList1" Name="class" 
                PropertyName="SelectedValue" Type="String" />  

                註解:這邊用的SelectedValue只能用單一值,複選的答案就沒效囉!
        </SelectParameters>

    </asp:SqlDataSource>

 

 

解法很簡單,就是要自己寫一點程式。程式也很短!不用怕!

這個程式,可以讓初學者學到---- SqlDataSource產生的許多SQL指令,可以放在後置程式碼來作。

 

HTML畫面設計:

 

 

以下是HTML畫面的原始碼,重點有:

  • GridView已經設定好 SqlDataSource1。(例如:GridView裡面,已經有 DataSourceID = "SqlDatasource1")
  • SqlDataSource1只留下「資料庫連接字串」,但SQL指令一片空白!!!!我用紅色框框標明~

 

 

接下來,撰寫後置程式碼,很簡單。

如果您看不懂的話,先從我另一個範例學起。

 

1.  多欄位的搜尋引擎,http://www.dotblogs.com.tw/mis2000lab/archive/2008/04/25/3503.aspx

2. 本書的第十章,最後一個大範例,對於這些東西也有講到,很有參考價值!

 

簡單地說,當您挑選好 CheckBoxList的選項(作了「複選」)之後,按下按鈕就會執行程式。

這時候,才透過程式,把您在 CheckBoxList挑選的數個子選項(Item)給組合起來。

1         string Search_String = "";
2
3         for (int i = 0; i < CheckBoxList1.Items.Count; i++)
4         {
5             if (CheckBoxList1.Items[i].Selected)
6             {
7                 Search_String += CheckBoxList1.Items[i].Text + ",";
8             }

9         }


 

[廣告]上述 CheckBoxList範例,在本書(上集 / ASP.NET 專題實務第三章就有提過。

        市面上的ASP.NET書籍,沒有人把 Web控制項 講的這麼詳細,每個都附上範例的!

        你還不買!真是對不起我蒐集這麼多範例了

 

程式的最後,才手動組合成 SqlDataSource的「SelectCommand」。這也是本範例比較特別的地方。

 

很多初學者都沒見過 SqlDataSource的 SelectCommand / UpdateCommand..等等,

可以在執行階段(後置程式碼)裡面去作。

可以參考一下。本書的(上集 / ASP.NET 專題實務第十章也有講到很多!

但是上面這支程式,為了遷就 SqlDataSource產生的指令與參數,作了很多的讓步,導至程式寫得不好,有些漏洞。 

 

2008/11/19補充:謝謝 Allen Kuo的提醒,我把程式稍作了修改:

        1.  防堵使用者不點選任何選項。

        2. 拼湊出來的SQL指令,會搜尋得更好一點。

 

修改後的 C# 程式如下:

01     protected void Button1_Click(object sender, EventArgs e)
02     {
03         string Search_String = "";
04         Boolean u_select = false;
05         int word_length = 0;
06
07         for (int i = 0; i < CheckBoxList1.Items.Count; i++)
08         {
09             if (CheckBoxList1.Items[i].Selected)
10             {
11                 Search_String = Search_String + " [class] LIKE '%" + CheckBoxList1.Items[i].Text + "%' or ";
12                 u_select = true;   //使用者有點選任何一個CheckBoxList子選項
13             }

14         }

15
16         if (u_select)
17         {
18             word_length = Search_String.Length;  //計算 Search_String的字串長度,VB語法為Len(Search_String)
19             Search_String = Left(Search_String, (word_length - 3));
20             //因為C#語法沒有 Left()函數,所以要自己寫!請看最下方。
21             //刪去最後三個字 「or 」
22             
23             Label1.Text = Search_String;
24         }

25         else
26         {
27             Label1.Text = "您尚未點選任何一個CheckBoxList子選項";
28             //Response.End();    //建議改成 return跳離。
29             return;
30         }
        
31
32         //=======================================
33         //== SqlDataSource1 資料庫的連接字串 ConnectionString,
34         //== 已事先寫在「HTML畫面的設定」裡面            ==
35         //=======================================
36         SqlDataSource1.SelectCommand = "SELECT [test_time], [id], [class], [title] FROM [test] WHERE " + Search_String;
37         //這次不使用 SqlDataSource提供的@參數
38     }

39
40
41     //因為C#語法沒有 Left()函數,所以要自己寫!
42     public static string Left(string param, int length)
43     {
44         //we start at 0 since we want to get the characters starting from the
45         //left and with the specified lenght and assign it to a variable
46         string result = param.Substring(0, length);
47         //return the result of the operation
48         return result;
49     }

 

 C# 補充說明:

1.  如果使用者未點選任何一個子選項,建議以  return跳開程式,並給予警告訊息。會比上述的 Response.End()來得好。

2. 下方的 Left()函數,因為是單一程式使用,可以免去 宣告時的 Static字眼。

3. 因為在HTML畫面,已經設定好GridView的 DataSourceID = "SqlDatasource1",所以不用寫 GridView.DataBind()。

 

VB版 程式如下:

01     Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
02         Dim Search_String As String = ""
03         Dim u_select As Boolean = False
04         Dim i, word_length As Integer
05
06         For i = 0 To (CheckBoxList1.Items.Count - 1)
07             If (CheckBoxList1.Items(i).Selected) Then
08                 Search_String = Search_String & " [class] LIKE '%" & CheckBoxList1.Items(i).Text & "%' or "
09                 u_select = True    '--使用者有點選任何一個CheckBoxList子選項
10             End If
11         Next
12
13         If (u_select = True) Then
14             word_length = Len(Search_String)    '--計算 Search_String的字串長度,VB語法為Len(Search_String)
15             Search_String = Left(Search_String, (word_length - 3))
16             '--刪去最後三個字 「or
17
18             Label1.Text = Search_String
19         Else
20             Label1.Text = "您尚未點選任何一個CheckBoxList子選項"
21             '--Response.End()    '--改成 Exit Sub 跳開這個副程式
22             Exit Sub
23         End If
24
25         '=======================================
26         '== SqlDataSource1 資料庫的連接字串 ConnectionString,
27         '== 已事先寫在「HTML畫面的設定」裡面 ==
28         '=======================================
29         SqlDataSource1.SelectCommand = "SELECT [test_time], [id], [class], [title] FROM [test] WHERE " & Search_String
30         '--這次不使用 SqlDataSource提供的@參數
31     End Sub

 

 

 ====================================================================================

最後,要跟各位報告一下,

這個程式的後置程式碼,參考一下還勉強可以啦!

但這個範例本身的「實用性」很低!!

你要作搜尋,當然是越精準越好,搜尋條件最好不要搞「複選」這樣會越找越 "發散"、越"模糊".....

 

以下又是廣告了~~~~

講完了,下面廣告的這本書上集 / ASP.NET 專題實務,希望各位踴躍購買,

我相信:對初學者真的有幫助!

很多其他書不講的細節,我都做成範例一一解釋了。

光是 GridView就有五大章(250頁)、Web控制項包含範例約100頁。都是其他書作不到的。

真的是誠意十足!

 



網頁上的補充範例(售後服務)不一定能立即提供 VB / C#語法(看時間夠不夠寫,請不要跟我們要)
書本上面的範例,一定有 VB / C#雙語法給您學習。          請看我們的「售後服務」範圍(嚴格認定)

 

防範SQL Injection / XSS攻擊,請看:ASP.NET安全寫作    資料來源 -- TWISC@NTUST網路應用安全知識庫

 

         

         

 


 

............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......

   

   ASP.NET 4.0 專題實務(松崗出版)

    榮獲 PChome  電腦類  2011年度 暢銷書

 

上 / 下兩集合購。優惠價1,180元(免郵資)

上/下兩集將近2,000頁,堪稱國內 [最詳盡]的ASP.NET範例教學。

 

上集( .NET 4.0版)全新改寫。範例增加66%,內容增加35%。上市以來,熱銷七刷

下集  為   VB、C#  「雙語法」版本,物超所值!

下集(第二版,黑皮書)上市一個月熱銷再刷,2010一年內(第一版)熱銷四刷第二版半年熱銷四刷! 下集內容增加66%。

南無普光佛  南無普明佛  南無普淨佛  南無多摩羅跋栴檀香佛  南無栴檀光佛  南無摩尼幢佛  南無歡喜藏摩尼寶積佛  南無一切世間樂見上大精進佛   南無摩尼幢燈光佛
南無慧炬照佛  南無海德光明佛   南無金剛牢強普散金光佛  南無大強精進勇猛佛  南無大悲光佛   南無慈力王佛  南無慈藏佛  南無栴檀窟莊嚴勝佛  南無賢善首佛
南無善意佛  南無廣莊嚴王佛  南無金華光佛  南無寶蓋照空自在力王佛  南無虛空寶華光佛  南無琉璃莊嚴王佛  南無普現色身光佛  南無不動智光佛  南無降伏眾魔王佛  
南無才光明佛  南無智慧勝佛  南無彌勒仙光佛  南無善寂月音妙尊智王佛  南無世淨光佛  南無龍種上尊王佛  南無日月光佛  南無日月珠光佛  南無慧幢勝王佛  
南無師子吼自在力王佛  南無妙音勝佛  南無常光幢佛  南無觀世燈佛  南無慧威燈王佛  南無法勝王佛  南無須彌光佛  南無須曼那華光佛  南無優曇鉢羅華殊勝王佛  
南無大慧力王佛  南無阿閦毗歡喜光佛  南無無量音聲王佛  南無才光佛   南無金海光佛  南無山海慧自在通王佛  南無大通光佛  南無一切法常滿王佛  南無釋迦牟尼佛
南無金剛不壞佛  南無寶光佛  南無龍尊王佛  南無精進軍佛  南無精進喜佛  南無寶火佛  南無寶月光佛  南無現無愚佛  南無寶月佛  南無無垢佛  南無離垢佛   
南無勇施佛  南無清淨佛  南無清淨施佛  南無娑留那佛  南無水天佛  南無堅德佛  南無栴檀功德佛  南無無量掬光佛  南無光德佛  南無無憂德佛
南無那羅延佛  南無功德華佛  南無蓮華光遊戲神通佛  南無財功德佛  南無德念佛  南無善名稱功德佛  南無紅燄帝幢王佛  南無善遊步功德佛  南無鬪戰勝佛  
南無善遊步佛  南無周匝莊嚴功德佛  南無寶華遊步佛  南無寶蓮華善住娑羅樹王佛   南無法界藏身阿彌陀佛

............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......

無垢清淨光  慧日破諸闇      能伏災風火  普明照世間