在藍色小舖看到這篇提問 -- 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就對啦~ )一定會更有感覺了。

 



網頁上的補充範例(售後服務)不一定能立即提供 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.台灣......

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