本文是備份,請看我的網站 ---- [習題] "選取" Gridview的某一列 & 那一列對應資料表的P.K.值

http://www.dotblogs.com.tw/mis2000lab/archive/2008/11/07/gridview_selectedindex_pk.aspx

 

 

 

在藍色小舖看到這篇提問 -- http://www.blueshop.com.tw/board/show.asp?subcde=BRD20081106215807V92&fumcde=FUM20041006161839LRJ&rplcnt=1

 

在我的書本裡面,「10.1節」也是講述相同的內容。

這篇文章是作一個補充。所以,本文算是給讀者的售後服務與補充

 

 

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

 

 

要擷取「使用者點選了 GridView的哪一列?」

有很多的寫法,但我測試過後,發現一些特別的狀況。

 

首先,我們開始設計HTML畫面如下。

畫面裡的 GridView請先設定好「選取」按鈕(命令欄位,CommandField)

完成 SqlDataSource之後,請務必檢查 GridView的「DataKeyNames」屬性是否抓到資料表的主索引鍵(P.K.)?

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

撰寫後置程式碼時,在不同的事件裡面,會有不同的情況出現。

  • 灰色字體,表示有些問題。
  • 黑色字體,表示OK!

    Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
        Response.Write("<hr>== GridView1_RowCommand() ==<br>")
        Response.Write("GridView1.SelectedIndex--  " & GridView1.SelectedIndex)
        Response.Write("<br>GridView1.SelectedValue-- " & GridView1.SelectedValue)

    End Sub

'--使用「選取(Select)」命令欄位,通常會用到底下這兩個事件!--

    Protected Sub GridView1_SelectedIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSelectEventArgs) Handles GridView1.SelectedIndexChanging
        Response.Write("<hr>== GridView1_SelectedIndexChanging() ==<br>")
        Response.Write("GridView1.SelectedIndex--  " & GridView1.SelectedIndex)
        Response.Write("<br>GridView1.SelectedValue-- " & GridView1.SelectedValue)

        Response.Write("<br>==============================")    '--下面這兩行,可以正常運作!
        Response.Write("<br>GridView1.Rows(e.NewSelectedIndex).RowIndex-- " & GridView1.Rows(e.NewSelectedIndex).RowIndex.ToString())    '--抓取那一列「對應資料表」的主索引鍵
        Response.Write("<br>e.NewSelectedIndex-- " & e.NewSelectedIndex.ToString())  '--抓取那一列「對應資料表」的主索引鍵
    End Sub

    Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
        Response.Write("<hr>== GridView1_SelectedIndexChanged() ==<br>")
        Response.Write("GridView1.SelectedIndex--  " & GridView1.SelectedIndex)
        Response.Write("<br>GridView1.SelectedValue-- " & GridView1.SelectedValue)
        Response.Write("<br>GridView1.SelectedDataKey.Value-- " & GridView1.SelectedDataKey.Value)
    End Sub

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

執行看看吧~ 

    第一次執行時,我們發現有些怪異狀況。

    在 RowCommadn()與 SelectedIndexChanging()這兩個事件內,

    這兩種寫法都會出現怪現象(如紅色框框所示)

 

    我故意在同一列,再按一次「選取」的命令欄位,就正常囉!

    請看下面紅色框框所示。     奇怪?數字正常了~

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

因為這篇文章是給本書讀者的課後補充,所以寫得檢約一點。

很多基本的觀念,都在書裡面講完了。

一本書,光講 GridView就能講到五大章(約250頁),絕對是有道理的!

 

小弟動手測試過後的結論

1.  當我們使用 GridView的「選取」命令欄位時,

     要抓取「使用者點選了哪一列?」,最好寫在 SelectedIndexChanged()事件裡面,運作起來會比較正常!

 

2.  上述的三個事件,我們可以發現「最優先 / 最早」被執行的是 RowCommand()事件

希望在 RowCommand()裡面,抓取到「資料表的主索引鍵」,可用下面的寫法:

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
        Dim pk_index As Integer = CInt(e.CommandArgument)
        Response.Write("<br>被點選的這一列,對應資料表的主索引鍵-- " & GridView1.DataKeys(pk_index).Value)

        註:C#語法請改為--

  • int pk_index = Convert.Int32(e.CommandArgument);
  • ..............GridView1.DataKeys[pk_index].Value.ToString();

End Sub

我一點都不厲害,因為微軟官方文件就有一樣的範例可抄

http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.rowcommand(VS.80).aspx 

 

3.  為什麼不使用 GridView1.SelectedRow呢?

因為這種寫法,抓到的是那一列(Row物件),而不是一個數值。

請看 http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.selectedrow(VS.80).aspx

微軟MSDN這麼說明 ---- 這與從 Rows 集合擷取位於由 SelectedIndex 屬性所指定之索引位置的 GridViewRow 物件是相同的。

 

4.   GridView1.SelectedIndex 的相關用法

請看 -- http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.selectedindex(VS.80).aspx

微軟MSDN這麼說明 ---- GridView 控制項中已選取資料列之以起始的索引。設值為 -1,表示目前選取任何資料列。

請回頭看看上面的第二張圖片(也就是第一次執行程式時的怪現象)

 

5.  給初學者的話,

  遇見問題時,立刻打開電腦,動手玩一下。像我這樣,立刻就會測試出一些狀況。

  然後上MSDN查詢文件與屬性,看看微軟(官方)怎麼說?

  如此一來就能自己學到很多東西!

        我當然知道「自己去找答案很苦」,但這艱苦的過程會讓我們記得更牢!

        更重要的是:學會自己找答案的方法!   這對我們終身 受用無窮~

 

老鳥跟菜鳥,到底差別在哪裡?

....差別在於「我們會自己盡量去找答案 。   而且已經發展出自己找答案、求知的"一套方法"了」

 

看完之後,再回頭看看上一篇文章([習題]GridView裡面,樣版(Template)內的控制項,怎麼抓取?使用FindControl就對啦~ )一定會更有感覺了。

.....................................................................................................................................................................................
ASP.NET專題實務ASP.NET專題實務(文魁出版 / P8187)

2008/八月份 天瓏書局排行榜前十名

.............................................................................................................. 寄信給我    mis2000lab (at) 雅虎.com.台灣 ........

創作者介紹

MIS2000 Lab -- ASP.NET專題實務 / 線上教學文件

MIS2000 Lab 發表在 痞客邦 PIXNET 留言(0) 人氣()