0

我需要通过选择without上的任意位置来找到RowIndex当前行的a 。基本上我需要它,因为我正在创建一个方法,该方法将根据. 而且我在各处都调用它,我不想再次编写相同的代码。GridviewSelectCommandObjectDataKeySelectedRowPage

这就是我所拥有的。

在 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   

    }
}

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

在复选框更改事件上

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 。我不知道该怎么做。请帮忙。

4

1 回答 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检查的特定内容,然后运行特定于它的操作。

于 2013-02-11T13:15:16.150 回答