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

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

GridView的 RowCommand事件
討論 GridViewCommandEventArgs.CommandSource 屬性

 

 

 

今天在論壇上看見網友的討論:

http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20140725110006GGM.html

自己也學到很多,趕緊做一個記錄。

 

Q : 在 GridView的樣板裡面,有一個 Label控制項

      我設定了一個按鈕(有CommandName),按下這個按鈕以後,如何 .FindControl() 抓到這個 Label ??

 

上一篇文章,是寫在GridView「選取」事件內  SelectedIndexChanged事件

      [習題] "選取" Gridview的某一列(RowIndex) & 那一列對應資料表的P.K.值

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

 

這一次,是寫在 RowCommand事件內(若是ListView,則為ItemCommand事件)

並使用了 e.CommandSource

 

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

第一,畫面上設定一個 GridView + SqlDataSource

          轉成 "樣板"之後,自己加入一個按鈕,並設定 CommandName = "Hello"

          這個作法很關鍵,不同的畫面設計,會讓您的程式寫法也有異動。

          下一篇文章會為您解說

 

第二,在 GridView的 RowCommand事件裡面撰寫程式。

我的作法,這篇文章已經有提過(方法一),就是我的作法。

[GridView]在 RowCommand事件中,自訂的Button 如何取出某一列(RowIndex) 的索引值。NamingContainer的入門用法

 

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Hello")
        {
            //*** 錯誤版 ***************************************************
            //Button BTN = (Button)sender;   
            //*** 發生錯誤,因為這裡的e與sender不是Button而是代表「GridView」!! *******
 
            //GridViewRow myRow = (GridViewRow)BTN.NamingContainer;
            ////-- 從你按下 Button按鈕的時候,知道你按下的按鈕在GridView「哪一列」!
            //Label LB = (Label)GridView1.Rows[myRow.DataItemIndex].FindControl("Label1");
            //Response.Write(LB.Text);
 
 
            //--- 正確版 (1) --------------------------------------------------------------------------------
            Button BTN =(Button)e.CommandSource;    //先抓到這個按鈕(我們設定了CommandName)
 
            GridViewRow myRow = (GridViewRow)BTN.NamingContainer;
            // 從你按下 Button按鈕的時候,NamingContainer知道你按下的按鈕在GridView「哪一列」!
 
            Label LB = (Label)GridView1.Rows[myRow.DataItemIndex].FindControl("Label1");
            //按下按鈕之後,這一列的列數(index)-- myRow.DataItemIndex
 
            Response.Write(LB.Text);
        }
    }

 

 

藍色小舖,網友  789789789的作法是:

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Hello")
        {
            //--- 正確版 (2) --------------------------------------------------------------------------------
            Label LB = (Label)((Control)e.CommandSource).FindControl("Label1");
 
            Response.Write(LB.Text);
        }
    }

 

也感謝 Allen Kuo在這篇討論裡面提供的建議 -- e.CommandSource

才能找出這個方法。

 

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

如果您要寫在 ListView裡面,請看這篇文章

ListView 的 ItemCommand事件中,找到是 "第幾列"執行的?某一列的索引值? ListViewDataItem的 DisplayIndex屬性 / DataItemIndex屬性

****** 這是我測試的範例,可運作 ******

protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
{
      Button BTN = (Button)e.CommandSource;
 
      ListViewDataItem  LVDItem = (ListViewDataItem)BTN.NamingContainer;
 
      Response.Write("<h3>這一列的索引(Index)--" + LVDItem.DataItemIndex + "</h3>" );
 
      Response.Write("<h3>這一列的索引(Index)--" + LVDItem.DisplayIndex + "</h3>");
}

 

 

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

 

我在微軟官方 msdn網站裡面,也找到類似的範例

您可以參考他的作法,類似我第一種的作法:

GridViewCommandEventArgs.CommandSource 屬性

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

 

<%@ Page language="C#" %>

<!DOCTYPE html>
<script runat="server">
 
  void CustomersGridView_RowCreated(Object sender, GridViewRowEventArgs e)
  {

    // The GridViewCommandEventArgs class does not contain a
    // property that indicates which row's command button was
    // clicked. To identify which row was clicked, use the button's
    // CommandArgument property by setting it to the row's index.
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // Retrieve the LinkButton control from the first column.
      LinkButton addButton = (LinkButton)e.Row.Cells[0].Controls[0];

      // Set the LinkButton's CommandArgument property with the
      // row's index.
      addButton.CommandArgument = e.Row.RowIndex.ToString();

      //我的註解:他在產生 GridView每一列的時候,偷偷加註每一列的索引號碼!放到按鈕裡面
    }

  }
  void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
  {
    // 我的註解:這個範例很讚的地方!
    // 在於他講解了 e.CommandName / e.CommandArgument / e.CommandSource三者!通通用上了

    // If multiple ButtonField columns are used, use the
    // CommandName property to determine which button was clicked.
    if(e.CommandName=="Add")
    {
      // Convert the row index stored in the CommandArgument
      // property to an Integer.
      int index = Convert.ToInt32(e.CommandArgument);

      // 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 customersGridView = (GridView)e.CommandSource;
      GridViewRow row = customersGridView.Rows[index];

      // Create a new ListItem object for the customer in the row.
      ListItem item = new ListItem();
      item.Text = Server.HtmlDecode(row.Cells[1].Text) + " " + Server.HtmlDecode(row.Cells[2].Text);

      // If the author is not already in the ListBox, add the ListItem
      // object to the Items collection of a ListBox control.
      if(!CustomersListBox.Items.Contains(item))
      {
        CustomersListBox.Items.Add(item);
      }
    }
  }

 

  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>GridViewCommandEventArgs Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <h3>GridViewCommandEventArgs Example</h3>

      <table width="100%">
        <tr>
          <td style="width:50%">
            <asp:gridview id="CustomersGridView" 
              datasourceid="CustomersSource" 
              autogeneratecolumns="false"
              onrowcommand="CustomersGridView_RowCommand"
              onrowcreated="CustomersGridView_RowCreated"  
              runat="server">

              <columns>

                <asp:ButtonField buttontype="Link" CommandName="Add" text="Add"/>

             重點提示:這裡並沒有轉成樣板!而是直接採用 GridView的「ButtonField」

                <asp:boundfield datafield="CompanyName" 
                  headertext="Company Name"/>
                <asp:boundfield datafield="City" 
                  headertext="City"/>

              </columns>

            </asp:gridview>
          </td>

          <td style="vertical-align:top; width:50%">
             Customers: <br/>
             <asp:listbox id="CustomersListBox"
               runat="server"/>
          </td>
        </tr>
      </table>

      <!-- This example uses Microsoft SQL Server and connects  -->
      <!-- to the Northwind sample database. Use an ASP.NET     -->
      <!-- expression to retrieve the connection string value   -->
      <!-- from the Web.config file.                            -->
      <asp:sqldatasource id="CustomersSource"
        selectcommand="Select [CustomerID], [CompanyName], [City] From [Customers]"
        connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>" 
        runat="server"/>

    </form>
  </body>
</html>

 

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

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

 

下一篇文章為您解析:

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

 

 

 

 

 

今日值班正妹,拐拐

http://style.fashionguide.com.tw/users/9043/shares

 

 

 

 

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

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

線上課程,遠距教學 (Web Form 49hr)  https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015

線上課程,遠距教學 (ASP.NET MVC 75hr)  https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab

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

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


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 (Web Form) 課程 上線了!MIS2000Lab.主講

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

 

ASP.NET MVC 5 線上教學

累積時數約 75小時...... 第一天(5.5小時)完整內容,"免費"讓您評估