[GridView]在 RowCommand事件中,自訂的Button 如何取出某一列(RowIndex) 的索引值#3 -- ButtonField 與 樣板裡面的Button,導致 e.CommandSource寫法不同

因為畫面設計的差異,會讓程式碼的寫法也不同,

如果您混合使用、不明白原因,就會犯下錯誤。

 

上一篇範例:

[GridView]在 RowCommand事件中,自訂的Button 如何取出某一列(RowIndex) 的索引值#2 -- e.CommandSource

 

 

有朋友詢問:  兩種作法的差異?而且他發現兩個疑問

 

???????????????????????????????????????????????????????????????????????????????????????????????????

根據微軟 MSDN的說法 --  在 GridView的 RowCommand事件裡面,您使用 e.CommandSource應該是抓到「整個GridView」

GridViewCommandEventArgs.CommandSource 屬性
 
屬性值
   類型:System.Object
   System.Object 類別的執行個體,表示命令來源。
 
備註
   請使用 CommandSource 屬性存取表示命令來源的物件屬性。
   若為 GridViewCommandEventArgs 物件,命令來源則是包含使用者所按下之按鈕的 GridView 控制項

 

msdn的範例,GridViewCommandEventArgs.CommandSource 屬性

http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridviewcommandeventargs.commandsource(v=vs.110).aspx

 

也是這樣撰寫的,程式碼如下:

  void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
  {

    if(e.CommandName=="Add")
    {
            // ...省略...

      GridView customersGridView = (GridView)e.CommandSource;
      GridViewRow row = customersGridView.Rows[index];

      // ...省略...
    }
  }

 

一樣在GridView的 RowCommand事件底下

為什麼我上一個範例,卻可以寫成這樣?

            //--- 正確版 (1) --------------------------------------------------------------------------------
            Button BTN =(Button)e.CommandSource;    //先抓到這個按鈕(我們設定了CommandName)
 
            GridViewRow myRow = (GridViewRow)BTN.NamingContainer;
            // 從你按下 Button按鈕的時候,NamingContainer知道你按下的按鈕在GridView「哪一列」!
 
 
 

問題一:很明顯的 e.CommandSource是一個錯誤啊?為何還能正確執行?

 

問題二:當他把我的寫法放進 msdn的範例中,改寫如下卻出現錯誤:

 

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Add")
        {
            // 上一個 RowCreated事件,已經把每一列的索引數(Index),設定在 LinkButton按鈕裡面了
            int index = Convert.ToInt32(e.CommandArgument);
 
            // 方法一:MSDN的作法 (正確運作)
            // Retrieve the row that contains the button clicked by the user from the Rows collection. 
            // Use the CommandSource property to access the GridView control.
            // GridView GV = (GridView)e.CommandSource;
            // GridViewRow row = GV.Rows[index];
 
            ////方法二:改用這種寫法。****發生錯誤**** WHY  ?????? 
            LinkButton BTN = (LinkButton)e.CommandSource;    //****發生錯誤**** !
            GridViewRow row = (GridViewRow)BTN.NamingContainer;
 
錯誤訊息:
Unable to cast object of type 'System.Web.UI.WebControls.GridView' to type 'System.Web.UI.WebControls.LinkButton'. 
 
          註解:錯誤訊息很明顯地說明了 e.CommandSource代表的是「整個GridView」啊!並不是 LinkButton
 
            // ...省略...
        }
    }

???????????????????????????????????????????????????????????????????????????????????????????????????

 

 

因為 HTML畫面設計(控制項)的差異,會讓程式碼的寫法也不同,
 
如果您混合使用、不明白原因,就會犯下錯誤。

***********************************************************************************************************************************

我的寫法  Button BTN =(Button)e.CommandSource

      搭配的畫面設計 --  GridView轉成「樣板」,然後加入一個 Button控制項

 

msdn範例的作法:GridView GV = (GridView)e.CommandSource;

      他的畫面設計,使用 GridView自己的「ButtonField」來做

      大型控制項的身體裡面,有 ButtonField / BoundField ....等等,如下圖:

      

***********************************************************************************************************************************

這就是差異所在。   ^_^

所以啊......寫程式要動腦想一下,不要只是上網找Code,然後 Copy / Paste

 

範例下載:GridView_RowCommand_FindControl.rar

 

 

您也可以參閱這篇文章的說明:

GridView RowCommand 事件

http://www.allenkuo.com/GenericArticle/view1209.aspx

 

 

    GridView的 RowCommand事件是什麼? .FindControl()方法、Controls[] 該怎麼用?有哪些變化?

      這不過是我書本「上集」第十章的內容而已

      上課第三天的進度罷了.......

 

如果您自認為基礎不錯了,可以單獨上兩天的研討會

[研討會] 大型控制項完全解密+ADO.NET實戰範例 (14hr)

 

 

 

為什麼 ASP.NET (Web Form)這麼簡單,你老是學不會?

因為買錯書、找錯老師了...................................

 

 

下面這2篇文章講到的,在「入門實戰班」都會學到。

內容保證比其他書本與補習班 更深入、充實!  

(拜託您一定要看一下,並自行評估自己能力,謝謝您!)

1.  [自我評量表] ASP.NET 我該上什麼課?入門、或是進階?.....

2.  [課程大綱]ASP.NET入門實戰 + ADO.NET進階班(七週),教學內容

3.  論學習歷程的三階段 -- 守破離  /  學得快才會想學!黃金20小時學習法

師資經歷:

微軟MVP獎得主(自2008年起)

資策會(南區)前任講師

ASP.NET暢銷書作者(台北市 天瓏書局譽為「唯一熱賣」、「常年熱銷」。PChome書店 2011/2012年度暢銷電腦書 ,我的書 上/下兩集都入榜)

美國商業週刊名列「全球百大科技業」技術經理,具有實務經驗(白天仍在上班),絕非坊間補習班聘用的無業界經驗、廉價講師

我(MIS2000 Lab.)親自為您授課!

 

上課時數更多!  

    價錢卻更便宜!(只要大型補習班的 六折 起)  

         師資更強!

 

有了這三大保證、三大特點   您還不報名,在等什麼?....請來信   mis2000lab (at) yahoo.com.tw   (at)就是@的意思

我要報名!請點選下圖。

 

 

 

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net



ASP.NET遠距教學、線上課程(Web Form + MVC)。 第二門 課程「四折」-- 以MVC課程 作優惠。
第一天課程, "完整" 試聽。  如不滿意  全額退費!
................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

*********************************************************************************************

*** ASP.NET MVC線上課程 第一天 免費看 (5.5小時) *** 

************************************************************(歡迎索取,免費申請)*****

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

......................................................................................................................................................

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

    MIS2000 Lab.  線上教學影片(YouTube) **免費觀賞**