我在 VS2008 中使用了一个 asp.net 4 网站项目(C#),并且我有一个带有 ItemUpdated 事件的 FormView:
<asp:FormView ID="FormView1" runat="server" DataSourceID="ds1" OnItemUpdated="FormView1_ItemUpdated">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("col1") %>' />
</EditItemTemplate>
</asp:FormView>
protected void FormView1_ItemUpdated(object sender, EventArgs e)
{
FormView1.DataBind(); // adding this line even doesn't help
TextBox box = FormView1.FindControl("TextBox1") as TextBox;
box.Enabled = false;
}
但我不明白,为什么在 ItemUpdated 事件之后会发生额外的“FormView1.DataBind()”或 Render(?)。结果是我在 ItemUpdated 事件中的代码变得像“覆盖”并且 TextBox1 没有被禁用。
当我在最后一行设置断点时“box.Enabled = false;” 然后我看到在 ItemUpdated 事件之后它再次跳转到 aspx 页面并逐步浏览 TextBoxes。
从另一个 GridView1_SelectedIndexChanged 禁用此 TextBox1 工作正常。
有什么方法可以查看调试中的“当前生命周期进度”?
编辑:
为了澄清推理...我有一个 GridView1,其中选择项目会填充上述 FormView1。关键是我需要禁用 FormView1 中的一些文本框,例如,用户访问级别。从 GridView1 中选择项目可以很好地禁用 TextBox1,但是当我单击 FormView1 上的更新按钮时,所有 TextBoxes 都会启用,即使我在通过 GridView1_SelectedIndexChanged() 函数运行的调试器代码中看到。在我重新选择 gridview 项目后,正确的 TextBoxes 再次被禁用。甚至使用此代码:
<asp:FormView ID="FormView1" runat="server" DataSourceID="ds1" DefaultMode="Edit" OnItemUpdated="FormView1_ItemUpdated">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("col1") %>' />
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("col2") %>' />
<asp:Button ID="Btn1" runat="server" CommandName="Update" Text="Update" />
</EditItemTemplate>
</asp:FormView>
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (UserAccess() == false) {
TextBox box2 = FormView1.FindControl("TextBox2") as TextBox;
box2.Enabled = false;
}
}
protected void FormView1_ItemUpdated(object sender, EventArgs e)
{
GridView1_SelectedIndexChanged(sender, e);
}
也许我应该通过另一个事件禁用我的文本框?