2016-06-16 73 views
1

我有一个ASP.NET的页面,在这里我有一个名为拉贝ROWID查找控制返回Null异常

 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。我甚至没有动态添加任何控件。可能是什么原因?

回答

2

GridView不仅具有DataRows,而且具有其他行类型,如标题,文本。你的控件是DataRow类型的。你需要检查你试图找到的行rowId是否为DataRow,因为有其他行类型将不会与idrowId你可以找到更多关于RowTypehere。你必须找到控制RowTypeDataRow

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); 

     } 
    } 
} 
+0

我都做到了。事实证明这确实是一个数据行 –

+0

你是否从FindControl中为rowId得到null,那么找到其他控件又该如何呢? – Adil

+0

我无法从gvrow获得任何控制 –