【问题标题】:Control inside EditItemTemplate will be available in Page_Load() only if只有在以下情况下,EditItemTemplate 中的控件才在 Page_Load() 中可用
【发布时间】:2009-04-21 21:12:29
【问题描述】:


在我的页面上,我定义了控件 TextBox1、Label1 和 GridView1。在 GridView1 中,我定义了以下模板:

           <asp:TemplateField>

              <ItemTemplate>
                <asp:LinkButton runat="server" Text="Edit" CommandName="Edit" ID="cmdEdit" />         
              </ItemTemplate>

              <EditItemTemplate>
                <asp:TextBox Text='<%# Bind("Notes") %>' runat="server" id="textBoxNotes" />
                <br /><br />
                <asp:LinkButton runat="server" Text="Update" 
                 CommandName="Update" ID="cmdUpdate" /> 
                <asp:LinkButton runat="server" Text="Cancel" 
                 CommandName="Cancel" ID="cmdCancel" />
              </EditItemTemplate>

            </asp:TemplateField>

如果用户在 textBoxNotes 中输入文本并单击 cmdUpdate 按钮,则在回发时调用 Page_Load() 时该文本将已经可用。


因此,如果用户在点击更新按钮cmdUpdate之前,还在TextBox1中输入了一个字符串“something”,那么下面的代码将提取用户在textBoxNotes中输入的文本

    protected void Page_Load(object sender, EventArgs e)
    {
        if(TextBox1.Text=="text from Notes")
        Label1.Text =((TextBox)gridEmployees.Rows[0].Cells[0].FindControl("textBoxNotes")).Text;
    }


A) 下面的代码也应该提取用户输入到 textBoxNotes 中的文本,但是当我单击 cmdEdit 按钮时,我得到“对象引用未设置为对象的实例”。异常

    protected void Page_Load(object sender, EventArgs e)
    {
        if(IsPostBack)
        Label1.Text =((TextBox)gridEmployees.Rows[0].Cells[0].FindControl("textBoxNotes")).Text;
    }

为什么会出现此异常?看起来好像 textBoxNotes 不存在。但它为什么不存在呢?


感谢

【问题讨论】:

    标签: c# asp.net gridview viewstate


    【解决方案1】:

    当更新事件发生时,该行不再处于编辑模式。因此页面上不存在 textBoxNotes。使用 gridview 的 RowUpdating 事件处理程序来访问编辑模板控件。

    public void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
         TextBox1.Text = ((TextBox)GridView1.Rows[e.RowIndex]
                                  .FindControl("textBoxNotes")).Text;
    }
    

    【讨论】:

      【解决方案2】:

      您在 Page_Load 中引用的方式发生在 gridview 的行实际存在之前。因为它发生在 PostBack 上,所以必须从 ViewState 重新创建 GridView(和触发事件)(重新:填充它的行)。虽然页面上的对象已经被初始化并且它们的值已经被填充,但是 GridView 还没有被重新创建并且它的事件还没有被触发。

      正如博士所说,这应该在 RowUpdating 事件中完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        相关资源
        最近更新 更多