2017-01-22 3 views
0

Ich stecke auf einer ASP-Seite fest.DataBound ASP: CheckBox-Ereignisse, die nicht wie erwartet ausgelöst werden, weil DataBinding auf Page_Load() auftritt

Die Seite enthält einen ASP: Container mit mehreren CheckBoxen. Ich muss ein Ereignis auf diese CheckBoxes OnCheckChange hinzufügen, so dass jedes Mal, wenn wir auf eine der CheckBoxen klicken, alle anderen Checkboxen deaktiviert werden. Ich könnte einen RadioButton verwenden, aber die Verwendung von CheckBoxes hat andere Vorteile für mich, die außerhalb dieses Themas liegen, deshalb möchte ich keine Radioknöpfe verwenden.

Das theorically fein dies wie funktionieren würde:

<ASP:Repeater id="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound"> 
    <ItemTemplate> 
     <asp:CheckBox id="MyCB" runat="server" OnCheckedChanged="MyCB_CheckedChanged" AutoPostBack="true" /> 
     <br/> 
    </ItemTemplate> 

    </ASP:Repeater> 

und in den Code hinter:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 


    protected void MyCB_CheckedChanged(object sender, EventArgs e) 
    { 
     UncheckallOtherCheckBoxes(); 
    } 

jedoch auch andere Regionen der Seite zu haben, wie erwartet funktionieren, muss ich um die DataSource bei jedem Laden der Seite und nicht nur beim ersten Mal zu binden. Also muss ich Page_Load zu

protected void Page_Load(object sender, EventArgs e) 
    { 
    // if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 

Und dies bewirkt, dass alles, was zum Scheitern verurteilt ändern! :) Weil, wenn ich auf ein Kontrollkästchen klicke, es_Onload vor MyCB_CheckedChanged() auslöst. Zuerst werden die DataBinds aufgerufen, und die Datenbindung sendet einige Checkbox-Ereignisse, die nicht vom Benutzer ausgeführt werden.

Gibt es eine Möglichkeit, dies zu lösen ????

Danke im Voraus.

+0

1. Sind Sie sicher, müssen Sie die Datenbank jedes Mal neu binden, wenn die Seite geladen wird? Das ist etwas ungewöhnlich - wenn Sie Ihre Gründe erklären möchten, könnte es anderen helfen, besser zu verstehen. –

+0

@Sandy: Ich denke, weil der in der Pose erwähnte Container in einen anderen Container geschachtelt ist. Wenn ich den Hauptcontainer für PostBack nicht neu bin, merke ich, dass alle untergeordneten Container keine Daten haben. –

Antwort

0

Versuchen Sie, Ihre Datenquelle möglichst später im Seitenlebenszyklus zu binden (z. B. onPreRender). Die Kontrollereignisse für Ihre Kontrollkästchen werden nach PageLoad und vor PreRender und einigen anderen Ereignissen behandelt. Einzelheiten finden Sie unter https://msdn.microsoft.com/en-us/library/ms178472.aspx.

+0

Ich hätte erwähnen sollen, dass der Container in einen anderen Container geschachtelt ist. Das ist der Pater-Container, der für die Checkboxen, die auf PostBack angezeigt werden, zurückgebucht werden muss. Also das gleiche Ergebnis, wenn ich meine Bindung in PreRender verschieben: Wenn ich nicht mein Vater Container, seine Datenquelle wird zurückgesetzt, gibt es keine Kinder-Container, so dass keine MyCB_CheckedChanged-Methode auslöst. Wenn ich nur auf PostBack = false, binden, wenn ein Kontrollkästchen aktiviert ist, wird die Seite neu geladen, der Vater-Container wird nicht neu gebunden und hat keine untergeordneten Elemente. Alle Kontrollkästchen verschwinden und erneut wird kein MyCB_CheckedChanged-Ereignis ausgelöst ... –

+0

Zusätzlich zum PreRender-Ereignis der Seite gibt es PreRender-Ereignisse auch für die meisten einzelnen Container. Haben Sie versucht, den übergeordneten Container erneut an sein eigenes PreRender-Ereignis anzubinden und den untergeordneten Container separat an das PreRender-Ereignis erneut zu binden. Auf diese Weise sollte der untergeordnete Container nach einem aktuellen übergeordneten Element suchen, was Sie möchten. –

+0

Es wäre auch schön, wenn Sie ein kleines Beispiel des Quellcodes zur Veranschaulichung des Problems bereitstellen würden. Es ist hilfreich für den Rest von uns, besser zu verstehen, was Sie tun. :) –

Verwandte Themen