ASP.NET - 详细信息视图标题模板中的按钮可见性更改在 OnMode 更改处理程序中不起作用

本文关键字:可见性 OnMode 不起作用 程序 处理 按钮 详细信息 NET 视图 标题 ASP | 更新日期: 2023-09-27 18:34:47

我有这个标记:

<asp:DetailsView ID="dvDatabase" OnModeChanging="dvDatabase_ModeChanging">
    <HeaderTemplate>
        <asp:Button ID="btnView" runat="server" CausesValidation="False" CommandName="Cancel"
            Text="View" CssClass="btn btn-primary" Visible="false" />
        <asp:Button runat="server" CausesValidation="False" CommandName="Edit"
            Text="Edit" CssClass="btn btn-success" ID="btnEdit" />
        <asp:Button runat="server" CausesValidation="False" CommandName="Delete"
            Text="Delete" CssClass="btn btn-danger" />
    </HeaderTemplate>
    ...

然后我有这个 C#:

protected void dvDatabase_ModeChanging(object sender, DetailsViewModeEventArgs e)
{
    bool isEdit = DetailsViewMode.Edit == e.NewMode;
    DetailsView view = (DetailsView)sender;
    Button viewButton = (Button)view.FindControl("btnView");
    Button editButton = (Button)view.FindControl("btnEdit");
    viewButton.Visible = isEdit;
    editButton.Visible = !isEdit;
}

我已经做了一些调试,Visible属性设置正确,但我从未看到按钮更改。 我点击了"编辑"按钮并处于编辑模式,但"编辑"按钮仍然显示,"查看"按钮仍然隐藏。 我尝试直接通过dvDatabase.FindControl查找按钮,而不是使用 object sender 变量,但这也不起作用。 我尝试引用带有基于标记中ID属性的变量的按钮,但btnViewbtnEdit变量/属性不存在。 这是怎么回事?

编辑:我按照蒂姆的建议切换到OnModeChanged,但按钮仍然没有改变。 这是我现在的 C#:

protected void dvDatabase_ModeChanged(object sender, EventArgs e)
{
    DetailsView view = /*(DetailsView)sender*/dvDatabase;
    bool isEdit = DetailsViewMode.Edit == view.CurrentMode;
    LinkButton viewButton = (LinkButton)view.FindControl("btnView");
    LinkButton editButton = (LinkButton)view.FindControl("btnEdit");
    viewButton.Visible = isEdit;
    editButton.Visible = !isEdit;
}

我尝试使用object senderdvDatabase类变量,但似乎都没有效果。

ASP.NET - 详细信息视图标题模板中的按钮可见性更改在 OnMode 更改处理程序中不起作用

改用DetailsViewDataBound事件,并且只对 DetailsView if(!Page.IsPostback)进行数据绑定。您还需要处理 ItemCommand 事件以调用相应的 ChangeMode 方法并对DetailsView进行数据绑定。

protected void dvDatabase_DataBound(Object sender, EventArgs e)
{ 
    var view = (DetailsView)sender;
    var btnView = (Button)view.FindControl("btnView");
    var btnEdit = (Button)view.FindControl("btnEdit");
    switch (view.CurrentMode)
    { 
        case DetailsViewMode.ReadOnly:
            btnView.Visible = false;
            btnEdit.Visible = true;
            break;
        case DetailsViewMode.Edit:
            btnView.Visible = true;
            btnEdit.Visible = false;
            break;
        case DetailsViewMode.Insert:
            btnView.Visible = false;
            btnEdit.Visible = false;
            break;
        default:
            break;
    }
}