Hallo.
Ich arbeite mir ASP.NET und einer SQL-DB un dem MSVS.
Ich habe ein GridView-Control auf der Website sowie ein Textfeld und ein Button.
Wenn ich nun auf den Button Klicke soll der Inhalt der TextBox auf dem GridView angezeigt werden .
Wenn man den Button mehrmals betätigt soll bei jedem Klick eine neue Linie der GridView hinzu gefügt werden.
Ich habe nun schon viel gegoogelt aber irgendwie bleibe ich immer an der Stelle hängen wo ich den Inhalt der TextBox auslesen muss.
Ich wäre sehr dankbar über ein kleines Beispiel.
mfg
Gurrnder
Hallo,
es gibt mehre Möglichkeiten. Die einfachste wäre folgende:
Du machst dir ein Datatable, welches nur eine Spalte hat und fügst diesem - immer wenn der Button gedrückt wird - eine neue Zeile hinzu. Danach bindest du das DataTable einfach an das Gridview.
Manuell könntest du auch die Zeile direkt am Gridview hinzufügen, ist aber unsauberer.
Wozu versuchst du so etwas, nur zum Üben oder für einen bestimmten Zweck?
Hallo ...
Dann werde ich mir gleich die DateTable anschauen.
Ja ich mache das zu einem Bestimmten Zweck.
Und zwar kann der User mehrere Daten (Datum) angeben (durch die TextBox) welche ihm dann gleich angezeigt werden sollen.
Später sollen sie dann in die DB geschrieben werden. Das sofortige in die DB schreiben ist zum jetztigen Zeitpunkt nicht möglich.
Diese DataTable kann ich auch nicht so einfach befüllen ... erstellen mit nur einer Spalte ist kein Problem aber den Inhalt der TB abfülllen daran scheiterts.
Hallo,
dies sollte dir eigentlich weiterhelfen. Mit jedem OnClick des Buttons wird eine Row erzeugt und diese dem DataTable hinzugefügt.
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
protected void Button1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataRow dr = dt.NewRow();
dr.Table.Columns.Add("Datum");
dr["Datum"] = TextBox3.Text.Trim();
dt.Rows.Add(dr);
foreach (GridViewRow row in GridView1.Rows)
{
dt.Rows.Add(row);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
Das habe ich mir zusammen gebastelt ... wenn ich da ein paar mal auf den Knopf drücke schaut das dann so aus:
Datum
23.9.2007
System.Web.UI.WebControls.GridViewRow
System.Web.UI.WebControls.GridViewRow
Also die erste Zeile stimmt und die übrigen sind komisch.
Hallo Gurrnder
evtl. liegt es am PostBack oder am ViewState der Controls. Normalerweise wird mit jedem Klick auf deinen Button ein PostBack ausgelöst und die Controls verlieren ihre Werte.
Gruß
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Also funktionieren tut das nun:
protected void Button1_Click(object sender, EventArgs e)
{
DataTable dt;
if(Session["tableDatum"] == null){
dt = new DataTable();
dt.Columns.Add("Datum");
}
else
{
dt = (DataTable)Session["tableDatum"];
}
DataRow dr = dt.NewRow();
dr["Datum"] = TextBox3.Text.Trim();
dt.Rows.Add(dr);
GridView1.DataSource = dt;
GridView1.DataBind();
Session.Add("tableDatum", dt);
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
try
{
GridView1.DeleteRow(e.RowIndex);
}
catch (System.StackOverflowException soe) { }
}
Nur die StackOverflowExeption macht ärger.
Hallo Gurrnder,
mir fällt jetzt auf Anhieb keine Grund für eine StackOverflowException ein. Wenn du eine Row löscht dann vernichtest du doch eher Werte als den Stack mit Werten zu befüllen. Schau doch mal in der MSDN Doku ob DeleteRow() überhaupt eine Exception wirft, die du abfangen kannst.
Gruß
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Hi
Hab ich gemacht. Ich finde zum einten keinen Hinweis darauf, dass überhaupt eine Exeption geworfen wird und zum andern haben die Beispiele überhaupt nichts mit GridView.DeleteRow() zu tun.
http://msdn2.microsoft.com/de-de/library/system.web.ui.webcontrols.gridview.deleterow(VS.80).aspx
Auf alle Fälle wird da eine Exeprion geworfen welche ich nicht mit Try/Catch abfangen kann.
Was hast du vor? Bestimmte Zeilen aus dem Gridview löschen?
Vor allem wie lautet die ErrorMessage der Exception?
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Ich denke ich weis nun was los ist. Zumindest denke ich das.$
Also ich habe eine GridView welche mir 2 Spalten hat. Eine für die Daten und die andere für den Delete Button.
Bei Klick auf den Delete button soll die Entsprechende Zeile gelöscht werden.
Hinzugefügt habe ich den Deletebutton über den GUI designer. Edit Columns --> Command Field.
Ich habe das gefühl das die Methode DeleteRows() nicht aufgerufen wird ... allerdings springt es in die Deleting und Deleted events.
Die exeption ist Folgende:
System.StackOverflowException was unhandled
An unhandled exception of type 'System.StackOverflowException' occurred in System.Web.dll
Und das ist wirklich schon alles. Ich blick da nicht so recht durch ... finde auch den Methodenaufruf nicht...
AH so... Die Exeption tritt auf weil ich die Methode DeleteRow() im Deleting-Event aufrufe. Denn die Methode DeleteRow() ruft auch immer noch diesen Event auf ...
Aber warum es nicht löscht kapier ich nicht.
Schau doch mal ob die entsprechenden Zeilen auch im DataSet gelöscht werden. Wenn nicht ist es kein Wunder, dass nach dem neuen Seitenaufbau die alten Werte noch drin stehen.
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Ich habe nun von der Methode DeleteRow() abstand genommen ... das ding ist Bugged.
Gelöst habe ich es so:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
DataTable dt = (DataTable)Session["tableDatum"];
dt.Rows.RemoveAt(e.RowIndex);
GridView1.DataSource = dt;
GridView1.DataBind();
}
Gut möglich das die Methode DeleteRow() immernoch von GridView aufgerufen wird ... aber so gehts.
Kleiner Hinweis zum Ende.
Mithilfe der DeleteRow-Methode können Sie den Datensatz am angegebenen Index programmgesteuert aus der Datenquelle löschen. Diese Methode wird in der Regel verwendet, wenn ein Datensatz von außerhalb des GridView-Steuerelements gelöscht werden muss, z. B. von einem anderen Steuerelement auf der Seite. Der Aufruf dieser Methode löst außerdem das RowDeleted-Ereignis und das RowDeleting-Ereignis aus.
Der letzte Satz aus dem MSDN Auszug macht deutlich warum du eine StackOverflowException bekommen hast.
Ich nehme an du hast es so ähnlich versucht:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
GridView.DeleteRow(e.RowIndex);
}
DeleteRow() löst eben das RowDeleting und das RowDeleted Event aus. Wenn du in den EventMethoden dann DeleteRow() aufrufst erzeugt du eine Schleife die irgendwann zum StackOverflow führen muss, wenn man keine Abbrechbedinung definiert ist.
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007