Laden...

C# ASP.NET Webanwendung dynamische Buttons

Erstellt von johnn vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.543 Views
J
johnn Themenstarter:in
6 Beiträge seit 2011
vor 13 Jahren
C# ASP.NET Webanwendung dynamische Buttons

Hallo,
ich bin gerade dabei eine Webanwendung zu erstellen in der ich auf eine SQL-Datenbank zugreife und in einer Tabelle ausgebe. In dieser Tabelle möchte ich in der ersten Spalte in jeder Zeile einen Button dynamisch erstellen. Heißt es ist nicht klar wieviele zeilen es werden. Beim drücken eines Button aus der Tabelle möchte ich eine Funktion aufrufen und einen parameter übergeben.
Der Button wird auch erstellt aber wenn ich einen Button drücke wird nichts ausgefüllt. Die seite ladet zwar neu aber die Tabelle ist leer. Woran kann das liegen?


for (rowCtr = 1; rowCtr <= rowCnt; rowCtr++)
        {
            // Create new row and add it to the table.
            TableRow tRow = new TableRow();
            Table1.Rows.Add(tRow);
            for (cellCtr = 1; cellCtr <= cellCnt; cellCtr++)
            {
                // Create a new cell and add it to the row.
                TableCell tCell = new TableCell();
                if (cellCtr == 1)
                {
                    Button btn = new Button();
                    btn.Text = "Testbutton";
                    
                    btn.CommandName = "text";
                    btn.ID = "Button1_Click1";
                    btn.CommandArgument = werte[rowCtr - 1, 1];
                    btn.OnClientClick = "Button1_Click1";

                    tCell.Text = "<button id=\"Button3\" runat=\"server\" onclick=\"Button3_Click\" title=\"Please Click\" >Click a Button</button>";
                }

                else
                {
                    tCell.Text = werte[rowCtr - 1, cellCtr - 1];
                }
                
                
                tRow.Cells.Add(tCell);
            }
        }

Gruß
Johnn

L
770 Beiträge seit 2006
vor 13 Jahren
  1. Du erstellst zwei verschiedene Buttons
  2. du musst btn als Control noch hinzufügen tCell.Controls.Add()
  3. Der Eventhandler sollte Click sein

lg Lion

J
johnn Themenstarter:in
6 Beiträge seit 2011
vor 13 Jahren

Ja der obere teil war der erste versuch. Hat nicht geklappt. Dann habe ich versucht das ganze über den "zweiten" button zu lösen und den ersten garnicht zu erstellen. Aber das Ergebnis ist immer das gleiche. Es wird die Tabelle_fuellen funktion nicht aufgerufen. Hier nochmal die Lösung so wie ich deine Antwort verstanden habe. Aber das Funktioniert auch nicht


for (rowCtr = 1; rowCtr <= rowCnt; rowCtr++)
        {
            // Create new row and add it to the table.
            TableRow tRow = new TableRow();
            Table1.Rows.Add(tRow);
            for (cellCtr = 1; cellCtr <= cellCnt; cellCtr++)
            {
                // Create a new cell and add it to the row.
                TableCell tCell = new TableCell();
                if (cellCtr == 1)
                {

                    Button btn = new Button();
                    btn.Text = "Testbutton";

                    btn.CommandName = "text";
                    btn.ID = "Button1_Click1";
                    btn.CommandArgument = werte[rowCtr - 1, 1];
                    btn.Click += Button1_Click1;
                    tCell.Controls.Add(btn);
                }

                else
                {
                    tCell.Text = werte[rowCtr - 1, cellCtr - 1];
                }
                
                
                tRow.Cells.Add(tCell);
            }
        }

L
770 Beiträge seit 2006
vor 13 Jahren

Und was genau funktioniert nicht? Nach deiner Aussage wird der Button dargestellt aber eine Funktion "Tabelle_fuellen" wird nicht aufgerufen, ok in deinen Code sehe ich nirgends einen Verweiß darauf (u.a. auch weil du den Eventhandler nicht zeigst).

Setzt mal paar Breakpoints und schaue, ob die Codezeilen verarbeitet werden bzw. der Eventhandler reagiert.

lg Lion

J
johnn Themenstarter:in
6 Beiträge seit 2011
vor 13 Jahren

Wenn ich Breakpoints setze und die Webanwendung im Firefox Öffne passiert nichts. Ich muss die Seite wohl mit dem Webdeveloper ausführen. Das Funktioniert aber nicht und es kommt folgende meldung.

Microsoft Visual Web Developer 2010 Express

Das Debugging kann auf dem Webserver nicht gestartet werden. Remotedebugging wird nicht unterstützt.

Klicken Sie auf "Hilfe", um weitere Informationen zu erhalten.

OK Hilfe

Hier ist der ausschnitt mit der SQLtabellefuellen funktion und dem aufruf Button3_Click.


protected void SQLtabelleFuellen(string query)
    {
        SqlConnection connection = new SqlConnection("Data Source=intranet\\sqlexpress;initial Catalog=db_kontaktverzeichnis;Integrated Security=True");
        connection.Open();
        SqlCommand readCommand = new SqlCommand(query, connection);

        SqlDataAdapter adapter = new SqlDataAdapter(readCommand);

        DataTable datatable = new DataTable(); adapter.Fill(datatable);
        string[,] werte = new string[datatable.Rows.Count, 8];
        for (int x = 0; x < datatable.Rows.Count; x++)
        {

            object[] values = datatable.Rows[x].ItemArray;
            //<input type="button" name="Text 1" value="Text 1 anzeigen"
            werte[x, 0] = values[0].ToString();
            werte[x, 1] = values[1].ToString();
            werte[x, 2] = values[2].ToString();
            werte[x, 3] = "<a href=\"mailto:" + values[3].ToString() + "\" target=\"_blank\">" + values[3].ToString() + "</a>";
            werte[x, 4] = values[4].ToString();
            werte[x, 5] = values[5].ToString();
            werte[x, 6] = values[6].ToString();
            werte[x, 7] = values[7].ToString();
   
        }

        connection.Close();


        // Total number of rows.
        int rowCnt;
        // Current row count.
        int rowCtr;
        // Total number of cells per row (columns).
        int cellCtr;
        // Current cell counter
        int cellCnt;


        rowCnt = datatable.Rows.Count;
        cellCnt = int.Parse("8");

        for (rowCtr = 1; rowCtr <= rowCnt; rowCtr++)
        {
            // Create new row and add it to the table.
            TableRow tRow = new TableRow();
            Table1.Rows.Add(tRow);
            for (cellCtr = 1; cellCtr <= cellCnt; cellCtr++)
            {
                // Create a new cell and add it to the row.
                TableCell tCell = new TableCell();
                if (cellCtr == 1)
                {

                    Button btn = new Button();
                    btn.Text = "Testbutton";

                    btn.CommandName = "text";
                    btn.ID = "Button3";
                    btn.CommandArgument = werte[rowCtr - 1, 1];
                    btn.Click += Button3_Click;
                    tCell.Controls.Add(btn);
                }

                else
                {
                    tCell.Text = werte[rowCtr - 1, cellCtr - 1];
                }
                
                
                tRow.Cells.Add(tCell);
            }
        }

        

    }

    protected void Button3_Click(object sender, EventArgs e)
    {


        Session.Add("abfrage", "SELECT * FROM tbl_kontakt WHERE vorname='ingo'");
        SQLtabelleFuellen(Session["abfrage"].ToString());
        
        
    }

J
johnn Themenstarter:in
6 Beiträge seit 2011
vor 13 Jahren

Ok also der Aufruf über die Dynamisch erstellten Buttons funktioniert. Aber wie bekomme ich jetzt einen Parameter übergeben?


 protected void SQLtabelleFuellen(string query)
    {
        SqlConnection connection = new SqlConnection("Data Source=intranet\\sqlexpress;initial Catalog=db_kontaktverzeichnis;Integrated Security=True");
        connection.Open();
        SqlCommand readCommand = new SqlCommand(query, connection);

        SqlDataAdapter adapter = new SqlDataAdapter(readCommand);

        DataTable datatable = new DataTable(); adapter.Fill(datatable);
        string[,] werte = new string[datatable.Rows.Count, 8];
        for (int x = 0; x < datatable.Rows.Count; x++)
        {

            object[] values = datatable.Rows[x].ItemArray;
            //<input type="button" name="Text 1" value="Text 1 anzeigen"
            werte[x, 0] = values[0].ToString();
            werte[x, 1] = values[1].ToString();
            werte[x, 2] = values[2].ToString();
            werte[x, 3] = "<a href=\"mailto:" + values[3].ToString() + "\" target=\"_blank\">" + values[3].ToString() + "</a>";
            werte[x, 4] = values[4].ToString();
            werte[x, 5] = values[5].ToString();
            werte[x, 6] = values[6].ToString();
            werte[x, 7] = values[7].ToString();
   
        }

        connection.Close();


        // Total number of rows.
        int rowCnt;
        // Current row count.
        int rowCtr;
        // Total number of cells per row (columns).
        int cellCtr;
        // Current cell counter
        int cellCnt;


        rowCnt = datatable.Rows.Count;
        cellCnt = int.Parse("8");

        for (rowCtr = 1; rowCtr <= rowCnt; rowCtr++)
        {
            // Create new row and add it to the table.
            TableRow tRow = new TableRow();
            Table1.Rows.Add(tRow);
            for (cellCtr = 1; cellCtr <= cellCnt; cellCtr++)
            {
                // Create a new cell and add it to the row.
                TableCell tCell = new TableCell();
                if (cellCtr == 1)
                {

                    Button btn = new Button();
                    btn.Text = "Testbutton";
                    
                    btn.CommandName = "text";
                    btn.ID = "Button3";
                    btn.Text = werte[rowCtr - 1, 0].ToString();
                    btn.CommandArgument = werte[rowCtr - 1, 1];
                    
                    btn.Click += Button3_Click;
                    tCell.Controls.Add(btn);
                }

                else
                {
                    tCell.Text = werte[rowCtr - 1, cellCtr - 1];
                }
                
                
                tRow.Cells.Add(tCell);
            }
        }

        

    }

    protected void Button3_Click(object sender,EventArgs e)
    {
        
        //Hier Brauche ich einen Parameter von einem dynamisch erstelltem button
        
        Button btn = (Button)sender;
        TextBox1.Text = btn.Text; //<-- das da gibt mir immer nur "button" aus. Nicht Testbutton was ich eigentlich haben wollte
        
        Session.Add("abfrage", "SELECT * FROM tbl_kontakt WHERE vorname='ingo'");
        SQLtabelleFuellen(Session["abfrage"].ToString());
        
        
    }

S
789 Beiträge seit 2007
vor 13 Jahren

Ohne den Quellcode jetzt genauer angesehen zu haben:
Kannst Du nicht CommandArgument auslesen?

Weitere Dinge:

  • Du muss jedem dynamisch erstellten Button eine eindeutige ID vergeben.

  • Du könntest ein Hiddenfield einbauen (statisch) und dieses beim Klick auf einen Button mit einem Wert befüllen, den Du dann im ClickEvent ausliest.

J
johnn Themenstarter:in
6 Beiträge seit 2011
vor 13 Jahren

Wenn ich den Button eine andere ID geben, dann wird das Clickevent nicht mehr ausgeführt 🙁

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Wenn ich den Button eine andere ID geben, dann wird das Clickevent nicht mehr ausgeführt

In welcher Methode erstellst Du denn eigentlich Deine Buttons? Wenn Du das im PreInit machst, sollte es schon funktionieren.

Aber das von-Hand-Erstellen der ganzen Tabelle ist eigentlich ziemlich grauselig. Schon mal überlegt, mit ner GridView und Datenbindung zu arbeiten?

Wenn Du dann im GridView AutoGenerateColumns auf false setzt und BoundFields für die Tabellenspalten und ein TemplateField für die Spalte mit den Knöpfen verwendest, erledigt ASP.NET fast alles andere automatisch.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

J
johnn Themenstarter:in
6 Beiträge seit 2011
vor 13 Jahren

Aber das von-Hand-Erstellen der ganzen Tabelle ist eigentlich ziemlich grauselig. Schon mal überlegt, mit ner
>
und Datenbindung zu arbeiten?

Wenn Du dann im GridView AutoGenerateColumns auf false setzt und
>
für die Tabellenspalten und ein
>
für die Spalte mit den Knöpfen verwendest, erledigt ASP.NET fast alles andere automatisch.

Gruß, MarsStein

Hey danke für den Tipp,
Habe meine Lösung jetzt auf deinen Vorschlag hin geändert 👍
Jetzt funktioniert es so wie ich es haben wollte. Sehr gut.
Vorallem ging es sehr schnell und es ist eine saubere Lösung. 😁
Danke
PS: habe hier ein gutes Beispiel für TemplateFields:
TemplateFields
Gruß
Johnn