要擷取「使用者 "點選" 了 GridView的哪一列?」
有很多的寫法,但我測試過後,發現一些特別的狀況。
在藍色小舖看到這篇提問 -- http://www.blueshop.com.tw/board/show.asp?subcde=BRD20081106215807V92&fumcde=FUM20041006161839LRJ&rplcnt=1
在我的書本(上集)裡面,「10.1節」也是講述相同的內容。
這篇文章是作一個補充。所以,本文算是給讀者的售後服務與補充
==========================================================================
要擷取「使用者點選了 GridView的哪一列(RowIndex)?」
有很多的寫法,但我測試過後,發現一些特別的狀況。
首先,我們開始設計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()) '--抓取那一列的index鍵
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
==========================================================================
執行看看吧~
第一次執行時,我們發現有些怪異狀況。
在 RowCommand()與 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
希望在 RowCommand事件裡面,抓取到「被點選的這一列 RowIndex」,可用下面的寫法:
2011/3/16補充: 另外一個範例,跟這個作法相關:[習題]如何觸發 GridView 身體裡面的「子控制項」的事件?#3 改良版
*******************************************************************************************************************
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. 給初學者的話,
遇見問題時,立刻打開電腦、打開Visual Studio,動手玩一下。像我這樣,立刻就會測試出一些狀況。
然後上MSDN查詢文件與屬性,看看微軟(官方)怎麼說?
如此一來就能自己學到很多東西!
我當然知道「自己去找答案很苦」,但這艱苦的過程會讓我們記得更牢!
更重要的是:學會自己找答案的方法! 這對我們終身 受用無窮~
老鳥跟菜鳥,到底差別在哪裡?
....差別在於「我們會自己盡量去找答案 。 而且已經發展出自己找答案、求知的"一套方法"了」
看完之後,再回頭看看上一篇文章([習題]GridView裡面,樣版(Template)內的控制項,怎麼抓取?使用FindControl就對啦~ )一定會更有感覺了。
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 140hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm 。 https://mis2000lab.medium.com/%E5%AD%B8%E5%93%A1%E6%84%9F%E8%A8%80-mis2000lab%E8%AA%B2%E7%A8%8B%E8%A9%95%E5%83%B9-asp-net-mvc-webform-77903ce9680b
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
ASP.NET MVC => .NET Core MVC 線上教學 ...... 第一天課程 完整內容 "免費"讓您評估 / 試聽
[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。