這是我在藍色小舖看見的問題,我想初學者應該會卡住,所以順手寫了解答給大家參考。
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)給組合起來。
[廣告]上述 CheckBoxList範例,在本書(上集 / ASP.NET 專題實務)第三章就有提過。
市面上的ASP.NET書籍,沒有人把 Web控制項 講的這麼詳細,每個都附上範例的!
你還不買!真是對不起我蒐集這麼多範例了
程式的最後,才手動組合成 SqlDataSource的「SelectCommand」。這也是本範例比較特別的地方。
很多初學者都沒見過 SqlDataSource的 SelectCommand / UpdateCommand..等等,
可以在執行階段(後置程式碼)裡面去作。
可以參考一下。本書的(上集 / ASP.NET 專題實務)第十章也有講到很多!
但是上面這支程式,為了遷就 SqlDataSource產生的指令與參數,作了很多的讓步,導至程式寫得不好,有些漏洞。
2008/11/19補充:謝謝 Allen Kuo的提醒,我把程式稍作了修改:
1. 防堵使用者不點選任何選項。
2. 拼湊出來的SQL指令,會搜尋得更好一點。
修改後的 C# 程式如下:
C# 補充說明:
1. 如果使用者未點選任何一個子選項,建議以 return跳開程式,並給予警告訊息。會比上述的 Response.End()來得好。
2. 下方的 Left()函數,因為是單一程式使用,可以免去 宣告時的 Static字眼。
3. 因為在HTML畫面,已經設定好GridView的 DataSourceID = "SqlDatasource1",所以不用寫 GridView.DataBind()。
VB版 程式如下:
01 
Protected Sub Button1_Click() 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.台灣......
南無普光佛 南無普明佛 南無普淨佛 南無多摩羅跋栴檀香佛 南無栴檀光佛 南無摩尼幢佛 南無歡喜藏摩尼寶積佛 南無一切世間樂見上大精進佛 南無摩尼幢燈光佛
南無慧炬照佛 南無海德光明佛 南無金剛牢強普散金光佛 南無大強精進勇猛佛 南無大悲光佛 南無慈力王佛 南無慈藏佛 南無栴檀窟莊嚴勝佛 南無賢善首佛
南無善意佛 南無廣莊嚴王佛 南無金華光佛 南無寶蓋照空自在力王佛 南無虛空寶華光佛 南無琉璃莊嚴王佛 南無普現色身光佛 南無不動智光佛 南無降伏眾魔王佛
南無才光明佛 南無智慧勝佛 南無彌勒仙光佛 南無善寂月音妙尊智王佛 南無世淨光佛 南無龍種上尊王佛 南無日月光佛 南無日月珠光佛 南無慧幢勝王佛
南無師子吼自在力王佛 南無妙音勝佛 南無常光幢佛 南無觀世燈佛 南無慧威燈王佛 南無法勝王佛 南無須彌光佛 南無須曼那華光佛 南無優曇鉢羅華殊勝王佛
南無大慧力王佛 南無阿閦毗歡喜光佛 南無無量音聲王佛 南無才光佛 南無金海光佛 南無山海慧自在通王佛 南無大通光佛 南無一切法常滿王佛 南無釋迦牟尼佛
南無金剛不壞佛 南無寶光佛 南無龍尊王佛 南無精進軍佛 南無精進喜佛 南無寶火佛 南無寶月光佛 南無現無愚佛 南無寶月佛 南無無垢佛 南無離垢佛
南無勇施佛 南無清淨佛 南無清淨施佛 南無娑留那佛 南無水天佛 南無堅德佛 南無栴檀功德佛 南無無量掬光佛 南無光德佛 南無無憂德佛
南無那羅延佛 南無功德華佛 南無蓮華光遊戲神通佛 南無財功德佛 南無德念佛 南無善名稱功德佛 南無紅燄帝幢王佛 南無善遊步功德佛 南無鬪戰勝佛
南無善遊步佛 南無周匝莊嚴功德佛 南無寶華遊步佛 南無寶蓮華善住娑羅樹王佛 南無法界藏身阿彌陀佛
............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......
無垢清淨光 慧日破諸闇 能伏災風火 普明照世間