我有一个asp .Net页面,其中有一个名为rowId的labe
protected void testResultsGridView_onRowUpdating(object sender, GridViewUpdateEventArgs e)
{
string str = string.Empty;
GridViewRow row = testResultsGridView.Rows[e.RowIndex];
Int32 id = Int32.Parse(((Label)row.FindControl("rowId")).Text);
String Cause = ((DropDownList)row.FindControl("Cause")).SelectedValue;
String comment = ((TextBox)row.FindControl("comment")).Text;
String check = ((TextBox)row.FindControl("check")).Text;
String reRunStatus = ((DropDownList)row.FindControl("Status")).SelectedValue;
String subCategory = ((DropDownList)row.FindControl("Category")).SelectedValue;
foreach (GridViewRow gvrow in testResultsGridView.Rows)
{
CheckBox chk = (CheckBox)gvrow.FindControl("cbSelect");
if (chk != null && chk.Checked)
{
id = Int32.Parse(((Label)gvrow.FindControl("rowId")).Text); ;
UpdateTestCase(id, rootCause, subCategory, comment, RTC, reRunStatus);
}
}
testResultsGridView.EditIndex = -1;
BindData();
}
在这种情况下,首先找到对rowId返回值的控制,然后在所选scheckbox中找到第二个返回null。我甚至没有动态添加任何控件。可能是什么原因?
答案 0 :(得分:2)
GridView不仅有DataRows,还有其他行类型,如header,foooter。您的控件是DataRow类型。您需要检查您尝试查找rowId
的行是否为DataRow
,因为还有其他行类型无法与id
rowId
进行控制您可以找到有关RowType
here的更多信息。您必须找到RowType
为DataRow
的控件。
if(gvrow.RowType == DataControlRowType.DataRow)
为何第一次有效
它首次运行,因为事件onRowUpdating是在具有DataRow类型的行上触发的。
为什么第二次不起作用
第二次迭代GridView的行也有其他行类型。如果您调试代码,当RowType
不是DataRow
时,您将看到它将为空。
您的代码将是
foreach (GridViewRow gvrow in testResultsGridView.Rows)
{
if(gvrow.RowType == DataControlRowType.DataRow)
{
CheckBox chk = (CheckBox)gvrow.FindControl("cbSelect");
if (chk != null && chk.Checked)
{
id = Int32.Parse(((Label)gvrow.FindControl("rowId")).Text); ;
UpdateTestCase(id, rootCause, subCategory, comment, RTC, reRunStatus);
}
}
}