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
lg Lion
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);
}
}
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
Das Debugging kann auf dem Webserver nicht gestartet werden. Remotedebugging wird nicht unterstützt.
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());
}
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());
}
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.
Wenn ich den Button eine andere ID geben, dann wird das Clickevent nicht mehr ausgeführt 🙁
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
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