C#NullReference,我需要初始化什么?

时间:2019-03-07 05:10:46

标签: c# asp.net

新手问题:为防止NullReferenceException到底需要初始化什么?我不明白变量是什么。我需要将哪个对象引用设置为哪个对象的实例?谢谢!

.aspx

        <p>
            <asp:GridView ID="gvConvo" runat="server" AutoGenerateColumns="False" OnSelectedIndexChanged="gvConvo_SelectedIndexChanged">
                <Columns>
                    <asp:TemplateField HeaderText="ID">
                        <ItemTemplate>
                            <asp:LinkButton ID="lbtnConvo" OnClick="lbtnConvo_Click" Text='<%#Eval("ConvoUID") %>' runat="server">LinkButton</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="Convo" HeaderText="Convo" />
                    <asp:BoundField DataField="ConvoDate" HeaderText="Date" />
                    <asp:BoundField DataField="ConvoDesc" HeaderText="Description" />
                    <asp:BoundField DataField="ConvoType" HeaderText="Type" />
                    <asp:BoundField DataField="MediaSource" HeaderText="Media Source" />
                </Columns>
            </asp:GridView>
        </p>
        <p>
            &nbsp;</p>
        <p>
            Convo:
            <asp:TextBox ID="txtConvoSelection" runat="server" OnTextChanged="txtConvoSelection_TextChanged"></asp:TextBox>
        </p>

.cs

        protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string PersuasionDBCon = ConfigurationManager.ConnectionStrings["PersuasionDBCon"].ConnectionString;
            using (SqlConnection con = new SqlConnection(PersuasionDBCon))
            {
                SqlCommand cmd = new SqlCommand("GetConvo", con);
                cmd.CommandType = CommandType.StoredProcedure;
                con.Open();
                gvConvo.DataSource = cmd.ExecuteReader();
                gvConvo.DataBind();
            }
        }
    }

    protected void lbtnConvo_Click(object sender, EventArgs e)
    {
        txtConvoSelection.Text = gvConvo.SelectedRow.Cells[1].Text;
    }

    protected void BtnSaveQuote_Click(object sender, EventArgs e)
    {

    }

    protected void gvConvo_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    protected void txtConvoSelection_TextChanged(object sender, EventArgs e)
    {

    }

这是引发异常的行:

txtConvoSelection.Text = gvConvo.SelectedRow.Cells[1].Text;

2 个答案:

答案 0 :(得分:2)

用于加载网格的代码被if (!IsPostBack){}块包围。你猜怎么了?按钮单击事件导致回发。这就是它的运行方式。每次执行回发时,整个页面都会从头开始。这就是HTTP的工作方式。

因此,当您单击按钮时,网格的数据未绑定,并且没有选定的行。

对此的最佳解决方案是使这种情况发生在javascript中,而不是C#中。为服务器上确实需要做的事情保留服务器事件。这将极大地提高感知性能(无需等待往返于可能遥远的服务器的往返路程),并且无需重新构建整个html文档即可进行简单的更改,从而帮助您的服务器扩展以处理更多用户。 / p>

答案 1 :(得分:0)

索引从0开始 gvConvo.SelectedRow.Cells[1]此字段必须为空

尝试

gvConvo.SelectedRow.Cells[0]

还要检查gvConvo.SelectedRow 网格中可能没有选择