我有一个网格视图,这个网格视图是绑定到我的数据库的数据。在我的网格视图中,我有一个编辑按钮,当用户单击编辑按钮时,将显示文本框,用户可以更改网格视图中的现有文本。到目前为止,我完成了所有这些工作。我制作了自己的验证方法,效果很好。但是,当我尝试在我的gvAddedEmployee_RowEditing
方法之前将其应用到我的FillGrid()
事件时,它给了我这个错误
“对象引用未设置为对象的实例。”
在我的验证方法的第一行。
private string ValidateRow(int rowIndex, DataRow row)
{
string employeeID= ((TextBox)gvAddedEmployee.Rows[rowIndex].FindControl("txtEmployeeID")).Text;
.....
}
这是我的RowEditing事件
protected void gvAddedEmployee_RowEditing(object sender, CommandEventArgs e)
{
//back up before editing
DataSet dsDetail = (DataSet)Session[GlobalVariables.SessionKey_];
Session[GlobalVariables.SessionKey_Before_Editing] = dsDetail.Copy();
gvAddedEmployee.EditIndex = Convert.ToInt32(e.CommandArgument);
int rowIndex = Convert.ToInt32(e.CommandArgument);
DataRow row = dsDetail.Tables[0].Rows[rowIndex];
//Error
string errMsg = ValidateRow(rowIndex, row);
divErrorMsg.InnerHtml = errMsg;
FillGrid();
}
我不确定如何解决这个问题,我们将不胜感激。
这是我使用完全相同代码的另一种方法
protected void gvAddedEmployee_RowUpdating(object sender, CommandEventArgs e)
{
int rowIndex = Convert.ToInt32(e.CommandArgument);
DataSet dsDetail = (DataSet)Session[GlobalVariables.SessionKey_];
DataRow row = dsDetail.Tables[0].Rows[rowIndex];
string errMsg = ValidateRow(rowIndex, row);
if (errMsg.Length == 0)
{
//code
}
divErrorMsg.InnerHtml = errMsg;
Session[GlobalVariables.SessionKey_] = dsDetail;
FillGrid();
}
答案 0 :(得分:1)
此异常背后的唯一原因是在执行此行代码时未找到TextBox控件:
((TextBox)gvAddedEmployee.Rows[rowIndex].FindControl("txtEmployeeID")).Text;
你可以在这里检查一些事情。
rowIndex
和row
的值。为了更好的调试目的,您可以尝试将TextBox代码行的查找和转换分为两部分:1。)找到GridView行对象。 2.)使用该行对象查找Control。
更新:
看起来你可能需要在RowEditing事件中访问它之前重新绑定你的GridView,因为它可能没有使用DataSource而失去它的状态。请查看此链接以获取参考:Finding control in RowEditing Event
希望这有帮助。