ASP.NET GridView RowIndex作为CommandArgument

时间:2008-12-23 16:48:43

标签: c# asp.net gridview

如何在按钮字段列按钮中访问并显示gridview项的行索引作为命令参数?

<gridview>
<Columns>
   <asp:ButtonField  ButtonType="Button" 
        CommandName="Edit" Text="Edit" Visible="True" 
        CommandArgument=" ? ? ? " />
.....

9 个答案:

答案 0 :(得分:96)

这是一个非常简单的方法:

<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True" 
                 CommandArgument='<%# Container.DataItemIndex %>' />

答案 1 :(得分:34)

MSDN说:

  

ButtonField类使用适当的索引值自动填充CommandArgument属性。对于其他命令按钮,您必须手动设置命令按钮的CommandArgument属性。例如,您可以将CommandArgument设置为&lt;%#Container.DataItemIndex%&gt;当GridView控件没有启用分页时。

所以你不需要手动设置它。然后使用GridViewCommandEventArgs的行命令可以访问它; e.g。

protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
    int rowIndex = Convert.ToInt32( e.CommandArgument );
    ...
}

答案 2 :(得分:12)

以下是Microsoft建议 http://msdn.microsoft.com/en-us/library/bb907626.aspx#Y800

在gridview上添加一个命令按钮并将其转换为模板,然后在这种情况下给它一个命令名“ AddToCart ”并添加CommandArgument “&lt;%# ((GridViewRow)容器).RowIndex%&gt;“

<asp:TemplateField>
  <ItemTemplate>
    <asp:Button ID="AddButton" runat="server" 
      CommandName="AddToCart" 
      CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
      Text="Add to Cart" />
  </ItemTemplate> 
</asp:TemplateField>

然后,对于gridview的RowCommand事件上的create,确定何时触发“AddToCart”命令,并从那里做任何你想做的事

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
  if (e.CommandName == "AddToCart")
  {
    // Retrieve the row index stored in the 
    // CommandArgument property.
    int index = Convert.ToInt32(e.CommandArgument);

    // Retrieve the row that contains the button 
    // from the Rows collection.
    GridViewRow row = GridView1.Rows[index];

    // Add code here to add the item to the shopping cart.
  }
}

**我犯的一个错误是我想在我的模板按钮上添加操作而不是直接在RowCommand事件上执行操作。

答案 3 :(得分:5)

我认为这会奏效。

<gridview>
<Columns>

            <asp:ButtonField  ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True" CommandArgument="<%# Container.DataItemIndex %>" />
        </Columns>
</gridview>

答案 4 :(得分:1)

void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    Button b = (Button)e.CommandSource;
    b.CommandArgument = ((GridViewRow)sender).RowIndex.ToString();
}

答案 5 :(得分:0)

我通常使用带有GridView的RowDatabound事件绑定此数据:

protected void FormatGridView(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow) 
   {
      ((Button)e.Row.Cells(0).FindControl("btnSpecial")).CommandArgument = e.Row.RowIndex.ToString();
   }
}

答案 6 :(得分:0)

<asp:TemplateField HeaderText="" ItemStyle-Width="20%" HeaderStyle-HorizontalAlign="Center">
                    <ItemTemplate>
                        <asp:LinkButton runat="server" ID="lnkAdd" Text="Add" CommandName="Add" CommandArgument='<%# Eval("EmpID"))%>' />
                    </ItemTemplate>
                </asp:TemplateField>

这是具有强类型数据的传统方式和最新版本的asp.net框架,您不需要像“EMPID”那样使用字符串

答案 7 :(得分:0)

使用分页时,您需要进行一些计算

int index = Convert.ToInt32(e.CommandArgument) % GridView1.PageSize;

答案 8 :(得分:-1)

<asp:LinkButton ID="LnkBtn" runat="server" Text="Text" RowIndex='<%# Container.DisplayIndex %>' CommandArgument='<%# Eval("??") %>' OnClick="LnkBtn_Click" />

在您的事件处理程序中:

Protected Sub LnkBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
  dim rowIndex as integer = sender.Attributes("RowIndex")
  'Here you can use also the command argument for any other value.
End Sub