在ItemUpdated事件之后,Databind将触发

时间:2012-10-02 09:38:04

标签: c# asp.net

我在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中的一些TextBox。 从GridView1中选择项目会禁用TextBox1,但是当我单击FormView1上的“更新”按钮时,即使我在通过GridView1_SelectedIndexChanged()函数运行的调试器代码中看到所有TextBox也已启用。在我重新选择gridview项后,再次禁用正确的TextBox。 甚至使用这段代码:

<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);
}

也许我应该通过其他活动禁用我的文本框?

2 个答案:

答案 0 :(得分:1)

这没有意义,请详细解释为什么要尝试禁用TextBox,你刚刚在问题中离开了ItemTemplate吗?还是它真的丢失了?如果它不知道为什么?

TextBox位于FormView的EditItemTemplate中,因此只有在FormView处于编辑模式时才可见。单击更新或取消后,将不再呈现TextBox,而是呈现ItemTemplate。因此,不需要将TextBox设置为禁用。

修改

好的,因为你编辑了你的问题。您需要使用FormView的OnDataBound事件,该事件发生在绑定结束时,并在此时禁用TextBox。

ASPX

<asp:FormView ID="FormView1" runat="server" DataSourceID="ds1" 
    OnDataBound="FormView1_DataBound">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("col1") %>' />
    </EditItemTemplate>
</asp:FormView>

aspx.cs

protected void FormView1_DataBound(object sender, EventARgs e)
{
    if (UserAccess() == false) {
        TextBox box2 = FormView1.FindControl("TextBox2") as TextBox;
        box2.Enabled = false;
    }
}

答案 1 :(得分:0)

而不是使用gridview选择的索引更改,您可以在formview上使用DataBound事件,因此每次formview重新绑定时您的逻辑都会触发。