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:
Einen Teil wo ich den Table Header erstelle und somit auch einen button
Die Funktion die von dem Button aufgerufen werden soll. (bei mir ist diese komplexer, nur an der Komplexität liegt es nicht, schon getestet)
Der Rest der Tabelle wird so erstellt:
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".
sry das es soviel code ist, nur leider weiss ich nicht wo ich einen Fehler gemacht habe und bin wirklich extrem ratlos :-/
mfg squadwuschel
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