在我的页面上,我已经定义了控件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不存在。但为什么不存在呢?
感谢名单
答案 0 :(得分:0)
发生Update事件时,该行不再处于编辑模式。因此,页面上不存在textBoxNotes。使用gridview的RowUpdating事件处理程序访问编辑模板控件。
public void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
TextBox1.Text = ((TextBox)GridView1.Rows[e.RowIndex]
.FindControl("textBoxNotes")).Text;
}
答案 1 :(得分:0)
您在Page_Load中引用的方式发生在gridview的行实际存在之前。因为它在PostBack上出现,所以必须从ViewState重新创建GridView(和触发事件)(re:它的行已填充)。当页面上的对象已经被初始化并且它们的值已被填充时,GridView尚未被重新创建,并且其事件未被触发。
正如博士所提到的,这应该在RowUpdating事件中完成。