none
GridView搭配DropDownList的問題 RRS feed

  • 問題

  • 我目前想要做到的功能是DDL啟用AutoPostBack

    然後選擇什麼,GridView就顯示符合的資料

    例如我選擇書籍,我的GridView會帶出所有分類是書籍的資料

    目前我是使用此種方法,但是在換頁的時候,資料會重新讀取SqlDataSource裡面的Select Command指令

    我的DDL目前有不限,書籍,電腦以及尚未分類四種

    這是我再DropDownList1_SelectedIndexChanged事件的語法

    If Me.DropDownList1.SelectedIndex = 0 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.GridView2.DataBind()
            End If
            If Me.DropDownList1.SelectedIndex = 1 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books where class=@class"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.SqlDataSource2.SelectParameters.Add("class", Me.DropDownList1.SelectedValue)
                Me.GridView2.DataBind()
            End If
            If Me.DropDownList1.SelectedIndex = 2 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books where class=@class"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.SqlDataSource2.SelectParameters.Add("class", Me.DropDownList1.SelectedValue)
                Me.GridView2.DataBind()
            End If
            If Me.DropDownList1.SelectedIndex = 3 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books where class is null"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.GridView2.DataBind()
            End If

    然後這是我的SqlDataSourcek的SelectCommand

            <aspTongue TiedqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="連接字串"
            SelectCommand="SELECT * From books">
            </aspTongue TiedqlDataSource>

    目前的問題是當我選擇書籍然後第一頁是正常的,要換頁時,所有的資料都跑出來了,書籍.電腦等等

    請問應該有什麼辦法可以解決呢?

    謝謝
    2008年12月9日 下午 02:49

解答

  •  crissead 寫信:

    所以就是要寫一個Private Sub name

    然後裡面寫

    If Me.DropDownList1.SelectedIndex = 0 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.GridView2.DataBind()
            End If...

     

    <恕刪...>


    之後供GV分頁,DDL的
    SelectedIndexChanged還有Page Load三個事件來呼叫囉?

     

    大致上是如此,畢竟你需要的邏輯判斷都是同一段不是嗎?如果要再挑剔一點,把一大串的IF...THEN...

    改為SELECT CASE敘述吧...效能應該會好一點點(可能感覺不出來啦)。

    2008年12月15日 上午 08:21

所有回覆

  • 使用 DropDownList 顯示 Master, 使用 GridView 顯示 Detail, 又是使用 SqlDataSource 做為資料來源, 這對 ASP.NET 而言是最典型的應用, 幾乎連一行程式都不用寫。當然, 你的 DropDownList 第三項看起來是「全部選取」的樣子。不過你可以把 SQL 指令寫在 Stored Procedure 就可以輕鬆的解決。像這種很基本的問題, 在網路上隨便可以找到幾萬項結果, 建議你參考一下: http://search.live.com/results.aspx?q=gridview+master+detail&form=QBLH

     

    或者直接看看這篇: http://www.dotblogs.com.tw/topcat/archive/2008/06/20/4341.aspx (有錄影教學範例)

    2008年12月9日 下午 03:08
  • 你好:

    我想要抓的三種類型第一個是全選(連NULL值也要抓出來),第二個是符合就好,第三個是只抓Null值

    我剛剛測試了一下

    一開始我先在where那邊設定資料行class,運算子=,來源Control控制項ID  DDL

    測試時,發現全部顯示資料和尚未分類會讀取不到

    但是DDL選擇書籍或電腦時可以抓取資料分頁也不會錯誤

    接著我改成資料行class,運算子LIKE,來源Control控制項ID  DDL

    全部顯示會讀取不到Null,書籍電腦可以顯示,尚未分類也讀取不到Null值

    因為我有些要抓NULL有些不用,有些又要全抓

    所以我才想說另外寫成我上面的樣子..


    2008年12月9日 下午 03:25
  • 問題應該是出在換頁時沒有執行如同DropDownList1_SelectedIndexChanged事件的邏輯判斷,所以在換頁事件引發PostPack後,只會執行你所預設的SelectCommand="SELECT * FROM books",解法是要在換頁的事件撰寫跟DropDownList1_SelectedIndexChanged事件一樣的程式碼,甚至要作排序的話也是比照辦理。

     

    基本上,我會建議將DropDownList1_SelectedIndexChanged事件裡的程式碼擷取為一函式,如此一來就可以重複呼叫。

     

    附帶一提,我是覺得既然你都要自行處理查詢命令了,SqlDataSource2的SelectCommand屬性可以直接拿掉,如果想在頁面一載入就載入預設列表,可以在Page_Load事件呼叫上述擷取的函式即可,更可以避免混淆。

    2008年12月10日 上午 03:18
  • 你好:

    所以就是要寫一個Private Sub name

    然後裡面寫

    If Me.DropDownList1.SelectedIndex = 0 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.GridView2.DataBind()
            End If
            If Me.DropDownList1.SelectedIndex = 1 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books where class=@class"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.SqlDataSource2.SelectParameters.Add("class", Me.DropDownList1.SelectedValue)
                Me.GridView2.DataBind()
            End If
            If Me.DropDownList1.SelectedIndex = 2 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books where class=@class"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.SqlDataSource2.SelectParameters.Add("class", Me.DropDownList1.SelectedValue)
                Me.GridView2.DataBind()
            End If
            If Me.DropDownList1.SelectedIndex = 3 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books where class is null"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.GridView2.DataBind()
            End If

    之後供GV分頁,DDL的
    SelectedIndexChanged還有Page Load三個事件來呼叫囉?
    2008年12月10日 上午 10:01
  •  crissead 寫信:

    所以就是要寫一個Private Sub name

    然後裡面寫

    If Me.DropDownList1.SelectedIndex = 0 Then
                Me.SqlDataSource2.SelectCommand = "Select * from books"
                Me.SqlDataSource2.SelectParameters.Clear()
                Me.GridView2.DataBind()
            End If...

     

    <恕刪...>


    之後供GV分頁,DDL的
    SelectedIndexChanged還有Page Load三個事件來呼叫囉?

     

    大致上是如此,畢竟你需要的邏輯判斷都是同一段不是嗎?如果要再挑剔一點,把一大串的IF...THEN...

    改為SELECT CASE敘述吧...效能應該會好一點點(可能感覺不出來啦)。

    2008年12月15日 上午 08:21