PostBackProblem mit Generierten Buttons

squadwuschel

Grünschnabel
Hio,

Also ich erzeuge eine Tabelle dynamisch und in dieser generiere ich auch noch Buttons, welche einen Eventhandler für Command besitzen und in diesem wird dann die zugehörige Button Funktion ausgeführt. Die Tabelle wird immer beim Pageload mit dem aktuellen dataTable generiert oder wenn ich einen Externen Button Nutzer ebenfalls. (p.s. handelt sich um eine Suche und die Tabelle stellt das Ergebnis dar.)

PROBLEM: Wenn ich nun auf einen Button in meiner Selbst zusammengebauten Tabelle klicke, dann muss ich immer 2x Mal klicken bevor dieser das Event ausführt. Ich habe es auch im Debugger probiert, dieser geht nur bei jedem zweiten mal in das zugehörige Event, sonst führt dieser nur die PageLoad Funktion aus.
Ich weiss leider nicht wie ich diesen Fehler beheben kann, hoffentlich kann mir jmd weiterhelfen. Anbei die zugehörigen Csharp Funktionen.

Das Pageload Funktion:
Code:
 protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        string error = "";

        if (!IsPostBack)
        {
            //in allen DropDownListen das "--bitte wählen--" Element hinzufügen
            initDDL();

            //Das Hidden Label setzten, in welchem ASC / DESC Sortierung zwischengespeichert wird
            LSortierung.Text = "DESCENDING";
        }

        //das erneute Laden der Ergebnistabelle, nachdem ein button gedrückt wurde wie download
        //beim ersten Laden der Seite, wird der catch Block ausgeführt, da es noch keine Session gibt und der Zugriff auf die id einen Fehler produziert
        try
        {
            //Laden des Session Objektes
            dt = (DataTable)Session["Table"];
            int version = Convert.ToInt16(dt.Rows[0]["id"]);
            //Anzeigen der Tabelle
            createTable(out error, ref table_search, dt);
        }
        catch
        {
            LError.Text = cnc.gsEr.gsEkeinesuchevorhanden;
        }
    }

Einen Teil wo ich den Table Header erstelle und somit auch einen button
Code:
 //Erstellen des Table Headers
        //Der TableHeader besteht aus Buttons, welche für die Sortierfunktion zuständig sind.
        //Die Buttons rufen die Event Funktion sortTable auf und übergeben im Commandname, den Spaltennamen
        //welcher sortiert werden soll

        TableRow row1 = new TableRow();
        table.Rows.Add(row1);
        
        //TableHeader "ID" erstellen
        TableCell cell1 = new TableCell();
        cell1.CssClass = "table_search";
        Button bt = new Button();
        bt.Text = "ID";
        bt.CssClass = "button_table_header";
        //Command Befehl übergibt die benötigten Spaltennamen, damit weiss man nach Welcher spalte sortiert werden soll
        bt.CommandName = "id";
        //Register the event-handling method for the Click event. 
        bt.Command += new CommandEventHandler(this.sortTable);
        cell1.Controls.Add(bt);
        cell1.HorizontalAlign = HorizontalAlign.Center;
        row1.Cells.Add(cell1);

 // ...... Weitere Header

Die Funktion die von dem Button aufgerufen werden soll. (bei mir ist diese komplexer, nur an der Komplexität liegt es nicht, schon getestet)
Code:
 private void sortTable(Object sender, CommandEventArgs e)
    {
       // ..... CODE

            //Die Sortierung für die angeklickte Spalte Spalte zusammenbauen, diese wird als Event Arg mit übergeben
            dt.DefaultView.Sort = e.CommandName + " " + s;
            Session["Table"] = dt.DefaultView.ToTable();
            createTable(out error, ref table_search, dt.DefaultView.ToTable());
        }
        catch
        {
            //Die Session ist abgelaufen
            LError.Text = cnc.gsEr.gsEsessionabgelaufen;
        }
    }

Der Rest der Tabelle wird so erstellt:
Code:
  private void createTable(out string error, ref Table table, DataTable dt)
    {
        error = "";

        //TODO, weil man im Moment 2 mal auf den View oder DL button klicken muss bevor etwas passiert
        table.Rows.Clear();
        //erstellen des TableHeaders
        createTableHeader(ref table);

        //Die Tabelle mit den gefundenen Dokumenten aufbauen
        //Die neuen Reihen einfügen
        for (int i = 1; i <= dt.Rows.Count; i++)
        {
            //eine neue Zeile erstellen
            TableRow row = new TableRow();
            table.Rows.Add(row);

            //Die einzelnen Spalten hinzufügen (+1 bei Count da wir 2 Spalten mehr benötigen durch die Beiden Buttons)
            for (int j = 1; j <= dt.Columns.Count +1; j++)
            {
                //Eine neue Zelle erstellen
                TableCell cell = new TableCell();
                cell.CssClass = "table_search_zeilen";

                //Es wird die ID des dokuments angezeigt
                if (j == 1)
                {
                    cell.CssClass = "table_search_zeilen";
                    cell.Text = dt.Rows[i-1]["id"].ToString();
                    cell.HorizontalAlign = HorizontalAlign.Center;
                    row.Cells.Add(cell);
                }

   //... weitere Zellen

Der Button startet die Suche und kreiert dann daraus die Tabelle, und legt ein Session Objekt mit der DataTable an, welches dann beim Pageload Event wieder mit geladne wird,
da sonst die Tabelle "weg ist".
Code:
 protected void BSearch_Click(object sender, EventArgs e)
    {
        string error = "";

        DataTable dt = new DataTable();
        
        //das akutelle formular auslesen 
        getFields();
        //Die suche starten mit den in getFields gesammelten Informationen
        dt = cnc.gsDB.searchDoc(out error, cnc.gsDoc);
        //Die Tabelle mit den Suchergebnissen erstellen
        createTable(out error, ref table_search, dt);

        //Speichern der aktuellen Tabelle in der Session, damit wenn auf den Download Button geklickt wird, 
        //Die Tabelle beim site Reload wieder angezeigt wird.
        Session["Table"] = dt;

        LError.Text = error;

    }

sry das es soviel code ist, nur leider weiss ich nicht wo ich einen Fehler gemacht habe und bin wirklich extrem ratlos :-/

mfg squadwuschel
 
code ist im anfangs post im Link enthalten,

Habe aber endlich die Lösung gefunden bzw. herausbekommen (nach 1 Tag im Web suchen^^) ich habe nicht gewusst, das man dem jeweiligen button immer eide ID zuweisen muss.

button.ID = ....

das habe ich nun getan und meine restlichen Probleme sind verschwunden :)

mfg SquadWuschel
 
Zurück