【问题标题】:Object is set to Null Reference when editing gridview编辑gridview时对象设置为空引用
【发布时间】:2025-12-17 01:55:02
【问题描述】:

在我的 Web 应用程序中,我有一个网格视图,并且这个网格视图是数据绑定的。在这个网格视图上方,我有一个文本框,用户可以首先在其中输入员工 ID 并在网格视图中显示员工姓名。在网格视图中,它具有编辑图标。当用户点击该编辑图标时,网格视图中的一些文本框将出现,用户可以编辑文本框中的文本。我让它工作到目前为止。但是,我的问题是当我试图在网格视图中编辑空文本框时,它给了我这个错误:

对象未设置为对象的实例

我所做的只是检查文本框是否为空。这确实忽略了错误,但不是我真正想要的

protected void txtEditedEmployeeID_TextChanged(object sender, EventArgs e)
{
    DatabaseManager dbManager = Common.GetDbManager();
    foreach (GridViewRow row in gridViewAddEmployee.Rows)
    {
        TextBox txtEmployee= (TextBox)row.FindControl("txtEmployeeID");
        if (txtEmployee!= null)
        {
            string personID = txtEmployee.Text;
            DataSet dsRE = dbManager.GetEmployeeNameByID(personID);
            for (int i = 0; i < dsRE.Tables[0].Rows.Count; i++)
            {
                string employeeFirstName = dsRE.Tables[0].Rows[i]["FIRST_NAME"].ToString();
                string employeeLastName = dsRE.Tables[0].Rows[i]["LAST_NAME"].ToString();
                ((TextBox)row.FindControl("txtEmployeeName")).Text = staffLastName + " " + staffFirstName;
            }
        }
        else
        {
        }
    }
}

HTML ASP.NET 代码

   <asp:TemplateField HeaderText="EmployeeID">
              <EditItemTemplate>
                    <asp:TextBox ID="txtEmployeeID" runat="server"  AutoPostBack="true" OnTextChanged= "txtEditedEmployeeID_TextChanged" Text='<%#Bind("Employee_ID") %>'Width="90px"></asp:TextBox>
              </EditItemTemplate>

              <ItemTemplate>
                   <asp:Label ID="lblEmployeeID" runat="server"  CssClass="GridInput" Text='<%#Bind("Employee_ID") %>'Width="90px"></asp:Label>
              </ItemTemplate>
    </asp:TemplateField>

<asp:TemplateField HeaderText="Employee Name">
      <EditItemTemplate>
           <asp:TextBox ID="txtEmployee" runat="server" ReadOnly ="true" Text='<%#Bind("Full_Name") %>'Width="90px"></asp:TextBox>
       </EditItemTemplate>
       <ItemTemplate>
           <asp:Label ID="lblEmployeeName" runat="server" CssClass="GridInput" Text='<%#Bind("Full_Name") %>'Width="90px"></asp:Label>
       </ItemTemplate>
</asp:TemplateField>

【问题讨论】:

  • 哪一行导致错误?
  • @MatthewSpencer, 'string personID = txtEmployee.Text;'如果我没有将 if(txtEmployee != null) 放入我的代码中,则会导致问题
  • txtEditedEmployeeID 触发事件是在 GridView 内部还是在 GridView 之上?如果你也发布 aspx 标记会更好。
  • 因为 texbox 不在行中而在标题中?而是在网格上使用 FindControl?
  • @DragonBorn - 为什么当用户更改文本框中的某些文本时调用txtEditedEmployeeID_TextChanged,会触发此事件。你到底想做什么?

标签: c# asp.net gridview


【解决方案1】:

在 Edit txtEmployeeID 将只出现在该行而不是 GridView 的所有行和在 TextBox Change 事件中,您会发现所有行编辑的 TextBox 直到现在才出现,所以您可以试试这个:

  protected void txtEditedEmployeeID_TextChanged(object sender, EventArgs e)
  {
      DatabaseManager dbManager = Common.GetDbManager();
      TextBox txt = sender as TextBox; // Edited TextBox
      GridViewRow row = (txt.NamingContainer as GridViewRow);// Row of Edited TextBox
      TextBox txtEmployee= (TextBox)row.FindControl("txtEmployeeID");
      string personID = txtEmployee.Text;
      DataSet dsRE = dbManager.GetEmployeeNameByID(personID);
      for (int i = 0; i < dsRE.Tables[0].Rows.Count; i++)
        {
          string employeeFirstName = dsRE.Tables[0].Rows[i]["FIRST_NAME"].ToString();
          string employeeLastName = dsRE.Tables[0].Rows[i]["LAST_NAME"].ToString();
          ((TextBox)row.FindControl("txtEmployeeName")).Text = staffLastName + " " + staffFirstName;
        }
  }

【讨论】:

    【解决方案2】:

    试试这个:

    代替

    TextBox txtEmployee= (TextBox)row.FindControl("txtEmployeeID");
    if (txtEmployee!= null)
    {
        string personID = txtEmployee.Text;
    

    你应该这样写

    TextBox txtEmployee = new TextBox();
    txtEmployee = (TextBox)row.FindControl("txtEmployeeID"); 
    if (!string.isNullorEmpty(txtEmployee.Text))
    {
        string personID = txtEmployee.Text;
    

    【讨论】:

    • 嗨 Mohit,你的意思是 txtEmployee.Text 对吗?但是,如果我尝试过,它仍然有同样的问题
    最近更新 更多