ASP.NET - Pulsante Visibilità Change in DetailSview HeaderTemplate Non funziona in OnModeChanging Handler

StackOverflow https://stackoverflow.com//questions/10692300

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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top