ASP.NET - Pulsante Visibilità Change in DetailSview HeaderTemplate Non funziona in OnModeChanging Handler
-
12-12-2019 - |
Domanda
Ho questo markup:
<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>
...
.
Allora ho questo 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;
}
.
Ho fatto alcuni debug e la proprietà Visible
viene impostata correttamente, ma non vedo mai i pulsanti cambiano.Ho premuto il pulsante Modifica e sono in modalità Modifica, ma il pulsante Modifica è ancora visualizzato e il pulsante di visualizzazione è ancora nascosto.Ho provato a trovare direttamente i pulsanti tramite dvDatabase.FindControl
direttamente, anziché utilizzare la variabile object sender
, ma non funziona neanche.Ho provato a fare riferimento ai pulsanti con variabili in base all'attributo ID
nel markup, ma btnView
e btnEdit
Variabili / Proprietà non esistono.Cosa sta succedendo?
Modifica: Sono passato a OnModeChanged
secondo il suggerimento di Tim, ma i pulsanti non cambiano ancora.Ecco il mio c # ora:
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;
}
.
Ho provato a utilizzare object sender
e la variabile di classe dvDatabase
, ma né sembrava avere un effetto.
Soluzione
Usa il DetailsView
's DataBound
Evento invece e solo Databind I dettagliView if(!Page.IsPostback)
.È inoltre necessario gestire il ItemCommand
Evento per chiamare l'appropriato Metodo ChangeMode
e Databind The 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;
}
}
.