我需要在没有RowIndex
的情况下选择Gridview
上的任何地方找到当前行的SelectCommand
。基本上我需要它,因为我正在创建一个方法,将返回Object
取决于DataKey
的SelectedRow
。我在Page
上到处呼叫它,我不想再次写相同的代码。
这就是我所拥有的。
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
并执行一些数据库工作。
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
。我不知道该怎么做。请帮忙。
您可以通过以下任一方法将所有3个CheckBoxes
中的事件路由到相同的方法:
cbIsReceived_CheckedChanged
作为所有三个复选框的事件处理程序或:CheckBoxes
事件的方法,那么对所有自动生成的方法执行此操作:
cbAnotherCheckBox_CheckedChanged(Object sender, EventArgs e)
{
// call the first method you've already written:
cbIsReceived_CheckedChanged(sender, e);
}
编辑:如果每个CheckBoxes
有不同的操作,则循环遍历行以获取已检查的特定CheckBox
,然后运行特定于它的操作。