1

从 gridview 将数据插入/更新到 sql server 数据库时,我收到“对象引用未设置为对象的实例”错误。任何人请帮助。

protected void GridAllStore_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        storelocatorDataSetTableAdapters.storedbTableAdapter tastoreInsert = new storelocatorDataSetTableAdapters.storedbTableAdapter();
        if (e.CommandName.Equals("Insert"))
        {
            TextBox txtNewName = new TextBox();
            TextBox txtNewContact = new TextBox();
            TextBox txtNewAddress = new TextBox();
            txtNewName = (TextBox)GridAllStore.FooterRow.FindControl("txtNewName");
            txtNewContact = (TextBox)GridAllStore.FooterRow.FindControl("txtNewContact");
            txtNewAddress = (TextBox)GridAllStore.FooterRow.FindControl("txtNewAddress");
            tastore.Insert(txtNewName.Text, txtNewContact.Text, txtNewAddress.Text);    
            FillGrid();          
        }
    }

这是错误消息:

你调用的对象是空的。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

源错误:

第 107 行:txtNewContact = (TextBox)GridAllStore.FooterRow.FindControl("txtNewContact");
第 108 行:txtNewAddress = (TextBox)GridAllStore.FooterRow.FindControl("txtNewAddress");
第 109 行:tastore.Insert(txtNewName.Text, txtNewContact.Text, txtNewAddress.Text);
第 110 行:FillGrid();
第 111 行:}

源文件:C:\Users\DELL\Documents\Visual Studio 2010\Projects\WebApplication1\WebApplication1\AdminPanel.aspx.cs 行:109

4

3 回答 3

1

错误信息的意思tastorenull在第 109 行,所以tastore需要初始化。你tastoreInsert在函数头和函数tastore.Insert体中写的东西弄糊涂了。

编辑:对不起,这也可能意味着三个文本框中的任何一个都不存在。如果找不到控件,则 FindControl 返回 null,因此您也需要查看这些控件。调试!

于 2012-04-24T07:12:22.437 回答
1

FindControl 可以返回 null,当你访问 null 对象的 Text 属性时会抛出异常。您可以在访问 Text 属性之前检查 null。

        var txtNewNameTb = (TextBox)GridAllStore.FooterRow.FindControl("txtNewName");
        var txtNewContactTb = (TextBox)GridAllStore.FooterRow.FindControl("txtNewContact");
        var txtNewAddressTb = (TextBox)GridAllStore.FooterRow.FindControl("txtNewAddress");

        if (txtNewNameTb == null || txtNewContactTb == null || txtNewAddressTb  == null) { return; }

        if(tastore == null)  { return; }

        tastore.Insert(txtNewNameTb.Text, txtNewContactTb.Text, txtNewAddressTb.Text);    

        FillGrid();          

在您的 ASPX FooterTemplate 中应该有 3 个文本框,如下所示。

<FooterTemplate> 
<asp:TextBox ID="txtNewName" runat="server" >
</asp:TextBox> 
<asp:TextBox ID="txtNewContact" runat="server" >
</asp:TextBox> 
<asp:TextBox ID="txtNewAddress" runat="server" >
</asp:TextBox> 
</FooterTemplate> 
于 2012-04-24T07:28:41.353 回答
0

使用Convert.ToString(txtNewNameTb.Text)
它会自动转换NULL为空字符串。

试试看:-

tastore.Insert(Convert.ToString(txtNewName.Text),Convert.ToString( txtNewContact.Text), Convert.ToString(txtNewAddress.Text));
于 2012-04-24T07:41:14.193 回答