如何通过在没有Select命令的gridview中选择任何位置来获取当前行索引

问题描述 投票:0回答:1

我需要在没有RowIndex的情况下选择Gridview上的任何地方找到当前行的SelectCommand。基本上我需要它,因为我正在创建一个方法,将返回Object取决于DataKeySelectedRow。我在Page上到处呼叫它,我不想再次写相同的代码。

这就是我所拥有的。

On RowDataBound

protected void gvOrders_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
      var dataKey = gvOrders.DataKeys[e.Row.RowIndex];

      if (dataKey == null)
            return;

      int orderId = AlwaysConvert.ToInt(dataKey["OrderId"]);

      Order cncOrder = OrderDataSource.Load(orderId);

       // do some work   

    }
}

现在我在gridview中有一个3 CheckBox列,所以每当我检查CheckBox状态时,我正在执行以下操作并再次加载Object并执行一些数据库工作。

On CheckBox Change Event

protected void cbIsReceived_CheckedChanged(object sender, EventArgs e)
{
    GridViewRow row = ((GridViewRow)((CheckBox)sender).NamingContainer);
    var dataKey = gvOrders.DataKeys[row.RowIndex];

    if (dataKey == null)
          return null;

    int orderId = AlwaysConvert.ToInt(dataKey["OrderId"]);
    Order cncOrder = OrderDataSource.Load(orderId);

    // find the controls using the current row index
    CheckBox cbIsReceived = (CheckBox)gvOrders.Rows[row.RowIndex].FindControl("cbIsReceived");
    Label receivedDateText = (Label)gvOrders.Rows[row.RowIndex].FindControl("receivedDateText");

    // do some work
}

正如你在两个事件中看到的那样,大多数代码都是找到current RowIndex并加载Object然后做一些数据库工作。

如果你注意到,在两种情况下提供的参数都不同,即OnRowBound(GridViewRowEventArgs e)和OnCheckBox_CheckedChanged(EventArgs e)。

因此,对于每个CheckBox列,我必须一次又一次地编写相同的代码。

我想创建方法,我可以通过Sender并获得当前的RowIndex。我不知道该怎么做。请帮忙。

c# asp.net gridview
1个回答
0
投票

您可以通过以下任一方法将所有3个CheckBoxes中的事件路由到相同的方法:

  1. 只需提供cbIsReceived_CheckedChanged作为所有三个复选框的事件处理程序或:
  2. 如果您已经生成了处理所有其他CheckBoxes事件的方法,那么对所有自动生成的方法执行此操作: cbAnotherCheckBox_CheckedChanged(Object sender, EventArgs e) { // call the first method you've already written: cbIsReceived_CheckedChanged(sender, e); } 编辑:如果每个CheckBoxes有不同的操作,则循环遍历行以获取已检查的特定CheckBox,然后运行特定于它的操作。
© www.soinside.com 2019 - 2024. All rights reserved.