Laden...

IPostBackHandler im UserControl funktioniert nicht

Erstellt von dr_d00m vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.361 Views
dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren
IPostBackHandler im UserControl funktioniert nicht

Hallo,
ich habe ein Problem mit einem Benutzersteuerelement. Und zwar habe ich mir ein Custom Control geschrieben, in dem ich per CheckBox Daten auswählen kann. Dieses habe ich in ein Panel gesteckt zusammen mit 2 Buttons, einen für OK und einen für abbrechen. Beim drücken auf OK wird ein weiteres Event ausgelöst, dass in den EventArgs die geklickten CheckBoxen übergibt. Leider habe ich schon in der Behandlungsmethode für den Button keinerlei zugriff mehr auf die Werte aus meinem Custom Control.

Die Übergabe der Werte aus dem Custom Control erfolgt so:
zuerst werden die geclickten CheckBoxen auf dem Client in ein hidden Input zwischengespeichert. Dieser wird dann beim PostBack ausgelesen mithilfe des der Implementierung des IPostBackHandler interfaces.
Das ganze Schema ist hier zu finden:
http://msdn.microsoft.com/en-us/library/aa479050.aspx#ccc-postback_topic5

Kurz: Wenn das hidden Input genau so heißt wie die Id des Custom Controls wird die Methode LoadPostData beim PostBack aufgerufen.

Leider passiert dies nicht wenn ich das Custom Control in ein User Control stecke. Derselbe Code innerhalb einer ASPX-Seite funktioniert einwandfrei.

Hat jemand schonmal was in die Richtung gemacht oder kann mir nen Hinweis in die richtige Richtung geben?

Danke schonmal und Gruß,

dr_d00m

S
406 Beiträge seit 2007
vor 15 Jahren

warum speicherst du deine Daten nicht in einer Session zwischen, die kannst du immer und überall abrufen und setzten.

bzw. evtl. mal mit FindControl gearbeitet, wenn du ein WebBenutzersteuerelement erstellst kannst du da direkt mit me.findControl die Elemente in deinem Control finden und dann z.b mittels Cast überprüfen ob die CheckBox ausgewählt wurde und das in der Session speichern und wieder überall abrufen bzw. müsstest du die Werte auch direkt mittels einer Funktion aus dem control auslesen können.

squadwuschel

Mein Blog über .NET und MVC / EF | Meine kostenlose Onlinearbeitszeitverwaltung My:Worktime

5.941 Beiträge seit 2005
vor 15 Jahren

Halo dr_d00m

Das liegt wohl -wie du schon vermutest - an den IDs.
Siehe dazu:

Wieso liest du die Items nicht einfach serverseitig aus?

Ich habe einen Artikel über IPostBackHandler und Konsorten geschrieben, das könnte auch interessieren:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hallo Peter, hallo squadwuschel,
wie ihr ja beide vorgeschlagen habt, habe ich versucht die CHeckBoxen serverseitig abzufragen. Leider ist das auch nicht wirklich gelungen. Sobald ich nämlich durch meinen Button auf der Seite einen PostBack auslöse und im Button_Click die Checkboxen auswerten will, scheint die komplette ControlCollection meines Custom Controls leer zu sein.

Irgendwie steh ich da grad auf dem Schlauch.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo dr_d00m

Okay... und jetzt? 😉

Was hast du, ein User- oder CustomControl?
Zeig mal etwas Code und Erklärungen dazu.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

OK, dann fang ich mal am besten ganz vorn an...
Also im Grunde brauche ich ein Control, dass mir verschiedene Spalten anzeigt und diese per CheckBox auswählbar macht. Zuerst hab ich es mit einem GridView versucht, in dessen ersten Spalte sich CheckBox-Controls befinden. Das funktionierte soweit auch ganz gut...dachte ich.
Dann bin ich auf ein zeimlich seltsames Problem gestoßen, dass ich hier gepostet habe:
http://www.aspnetzone.de/forums/thread/200014.aspx
Leider hab ich weder in dem Post noch unter Google oder sonstwo eine Antwort gefunden. Allerdings musste ich feststellen, dass das beschreibene Verhalten nur unter .Net aber nicht unter Mono (für das die Anwendung unter anderem auch sein soll) auftritt.
Nunja, da sich das so nicht implementieren ließ, hab ich angefangen mir ein eigenes Control zu schreiben, dass mir eine Tabelle mit Checkboxen darstellt.
Im Grunde lese ich dazu aus einem DataView die Werte aus und lasse sie von meinem Control darstellen.


for (int i = 0; i < DataSource.Table.Rows.Count; i++)
            {
                TableRow tableRow = new TableRow();
                table.Rows.Add(tableRow);
                CheckBox cb = new CheckBox();        
                
                TableCell tableCell = new TableCell();
                tableCell.Controls.Add(cb);
                tableRow.Cells.Add(tableCell);

                foreach (DataColumn column in DataSource.Table.Columns)
                {
                    // Some Columns are excepted from the view
                    if (!column.ColumnName.Contains("ID") && column.ColumnName != "E_COUNT")
                    {
                        TableCell cell = new TableCell();
                        cell.Text = Convert.ToString(DataSource.Table.Rows[i][column]);
                        tableRow.Cells.Add(cell);
                    }
                }
            }

Die table wird dann per Controls.Add(table) zum Control hinzugefügt gerendert etc.
Soweit funktioniert das auch, was die Darstellung angeht.

Per Javascript wird auf dem Client beim Click auf eine CheckBox ein hidden Field mit Werten (genau genommen ist es ein String mit kommaseparierten Werten) gefüllt, die die angeklickten CheckBoxen enthalten. Das funktioniert auch.

Setzen des Hidden Field innerhalb des Custom Controls:


Page.ClientScript.RegisterHiddenField(ID, "");  

Da das hidden Field die selbe ID hat wie mein Custom Control, sollte eigentlich beim PostBack die Funktion


LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)

aufgerufen werden. Dies funktioniert allerdings nur auf ASPX-Seiten und nicht in einem UserControl. Ich hab das mit dem Debugger überprüft. Bei der Implementierung in einem User Control wurde der Haltepunkte nicht angesprungen, auf einer einfachen ASPX-Seite schon.

Zum Aufbau meines UserControls:
Da ich das Custom Control nur als Ersatz für meine GridView-Version geschrieben habe, ist noch weitere Funktionalität in einem UserControl gekapselt. Hier habe ich ein Panel mit der Auswahltabelle, einem OK-Button und einem Cancel-Button. Das ganze wird per ModalPopUpExtender ein, bzw. ausgeblendet. Dazu existiert außerhalb des Panels noch ein leerer LinkButton, an den der ModalPopUpExtender gehangen ist.


<div id="pick_list">
    <asp:LinkButton ID="LinkButton1" runat="server"></asp:LinkButton>
    <asp:Panel ID="PickListPanel" runat="server" BorderColor="Black" BorderStyle="Solid"
        Height="512" BackColor="#E1F0FF">
        <div id="heading">
            <asp:Label ID="headingPickList" runat="server" Text="Bitte wählen:"></asp:Label>
        </div>
        <div id="pick_grid">
            
            <cc2:DataViewRowSelector ID="DataViewRowSelector1" runat="server" />            
        </div>
        <div id="buttons">><asp:Button ID="SubmitButton" CssClass="button" runat="server" Text="OK" OnClick="SubmitButton_Click" />
            <asp:Button ID="CancelButton" CssClass="button" runat="server" Text="Abbrechen" OnClick="CancelButton_Click" />
        </div>
    </asp:Panel>
    <cc1:ModalPopupExtender ID="LinkButton1_ModalPopupExtender" runat="server" DynamicServicePath=""
        Enabled="True" TargetControlID="LinkButton1" PopupControlID="PickListPanel" Drag="true"
        DropShadow="true" BackgroundCssClass="watermarked">
    </cc1:ModalPopupExtender>
</div>

Desweiteren konnte ich feststellen, dass innerhalb der Button_Click Methode, die ControlCollection meines Custom Controls null (wie auch alle anderen Properties) wird. Somit krieg ich auch keine serverseitige Abfrage hin.

So, ich hoffe ich hab das Problem einigermaßen dargelegt und nichts vergessen. Ich bin grad an einem Punkt an dem ich den Wald vor lauter Bäumen nicht sehe und deshalb auch vielleicht kleinere Fehler nicht mehr erkenne, darum danke schonmal für die Hilfe.

Gruß
dr_d00m