代码改变世界

GridViewCommandEventArgs 事件参数没有包含用于指示单击按钮所在行的属性?

2006-08-05 20:55  晓风残月  阅读(...)  评论(... 编辑 收藏

datagrid、datalist、repeat的ItemCommand 事件参数都有一个Item属性可以得到激发当前事件控件所在行,但是GridView的GridViewCommandEventArgs 却没有这个属性

不过,MSDN也说明了解决方案:

Note注意

GridViewCommandEventArgs 类未包含一个用于指示单击按钮所在行的属性。如果需要知道哪个行引发了事件,请使用 CommandArgument 属性将行的索引传给事件处理方法。

同时也,提供一个实例:
<%@ Page language="C#" %>

<script runat="server">

  
void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
  
{
    
// If multiple buttons are used in a GridView control, 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.
      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[2].Text);
            
      
// If the customer is not already in the ListBox, add the ListItem 
      
// object to the Items collection of the ListBox control. 
      if (!CustomersListBox.Items.Contains(item))
      
{
        CustomersListBox.Items.Add(item);
      }
           
    }

  }


  
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's button 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();
    }


  }

    
</script>

<html>
  
<body>
    
<form runat="server">
        
      
<h3>GridView RowCommand Example</h3>
            
      
<table width="100%">         
        
<tr>                
          
<td width="50%">
                    
            
<asp:gridview id="CustomersGridView" 
              datasourceid
="CustomersSource"
              allowpaging
="true" 
              autogeneratecolumns
="false"
              onrowcommand
="CustomersGridView_RowCommand"
              onrowcreated
="CustomersGridView_RowCreated"  
              runat
="server">
                
              
<columns>
                
<asp:buttonfield buttontype="Link" 
                  commandname
="Add" 
                  text
="Add"/>
                
<asp:boundfield datafield="CustomerID" 
                  headertext
="Customer ID"/>
                
<asp:boundfield datafield="CompanyName" 
                  headertext
="Company Name"/> 
                
<asp:boundfield datafield="City" 
                  headertext
="City"/>         
              
</columns>
                
            
</asp:gridview>
                    
          
</td>
                    
          
<td valign="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>

让人非常遗憾的是,为什么ASPNET不提供这个属性,这个属性应该是很常用的,难道是又一个疏忽?
按新版控件GridView的命名习惯,如果提供一个GridViewRow类型的Row属性,对于我们开发人员就方便多了,
省去了手动添加RowIndex,然后还要解析出来,当ComandArg参数多的时候更麻烦

当然对于简单的情况可以使用声名的方式绑定RowIndex,也就不需要在Created事件处理:
<asp:imagebutton skinid="ChangeOrder" commandargument="<%# ((GridViewRow)Container).RowIndex %>" runat="server" id="btnChangeOrder" imageurl="~/Designer/images/updown.gif" causesvalidation="false" commandname="ChangeOrder"/>