我有这个标记:
<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
属性的变量的按钮,但btnView
和btnEdit
变量/属性不存在。 这是怎么回事?
编辑:我按照蒂姆的建议切换到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 sender
和dvDatabase
类变量,但似乎都没有效果。
改用DetailsView
的DataBound
事件,并且只对 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;
}
}