Ich arbeite in ASP.Net mit C# als Code-Behind. Der Editor ist Visual Studio 2012. Ich habe ein GridView mit 5 Spalten erstellt: Die erste enthält Kontrollkästchen, die nächsten 3 haben Textfelder und die letzte ist ein ButtonField, wie folgt (AutoGenerateColumns habe ich auf false gesetzt, da sonst DataBind weitere Spalten hinzufügt):
Ich muss das GridView anzeigen, wenn ein Element aus einem Dropdown ausgewählt wird. Das GridView muss immer 8 Zeilen haben. Ich habe folgenden Code geschrieben, um das GridView anzuzeigen:
DataTable dt = ViewState["dt"] as DataTable;
if (dt == null)
{
dt = new DataTable();
dt.Columns.Add("", typeof(Boolean));
dt.Columns.Add("Modulcode", typeof(String));
dt.Columns.Add("Modulname", typeof(String));
dt.Columns.Add("Leistungspunkte", typeof(String));
for (int i = 0; i < 8; i++)
{
dt.Rows.Add(dt.NewRow());
}
}
gvCDS.DataSource = dt;
gvCDS.DataBind();
ViewState["dt"] = dt;
gvCDS.Visible = true;
Der Benutzer gibt einige Eingaben in das GridView ein und klickt dann auf eine Schaltfläche. Im Klick-Ereignisverfahren der Schaltfläche muss ich die angeklickten Zeilen aus dem GridView löschen und Zeilen hinzufügen, sodass die Gesamtzahl der Zeilen bei 8 bleibt. Wenn ich einfach die .DeleteRow-Methode aufrufe, wird die Zeile nicht gelöscht. Ich sehe das GridView immer noch wie zuvor im Browser. Also kopiere ich zuerst den Inhalt des GridView in ein DataTable wie folgt:
DataTable dt = ViewState["dt"] as DataTable;
int rowCounter = 0;
foreach (GridViewRow row in gvCDS.Rows)
{
DataRow dr = dt.Rows[rowCounter];
dr[0] = ((CheckBox)row.FindControl("cbSelectedCDS")).Checked;
dr[1] = ((TextBox)row.FindControl("tbxInputCDSModuleCode")).Text;
dr[2] = ((TextBox)row.FindControl("tbxInputCDSModuleName")).Text;
dr[3] = ((TextBox)row.FindControl("tbxInputCDSCreditUnits")).Text;
rowCounter++;
}
Stattdessen die Zeilen aus dem GridView zu löschen, lösche ich sie aus dem DataTable wie folgt:
rowCounter = 0;
int rowsDeleted = 0;
foreach (GridViewRow row in gvCDS.Rows)
{
if (((CheckBox)row.FindControl("cbSelectedCDS")).Checked)
{
dt.Rows.RemoveAt(rowCounter);
rowsDeleted++;
}
else
{
rowCounter++;
}
}
rowsDeleted enthält jetzt die Anzahl der gelöschten Zeilen. Ich füge so viele Zeilen im DataTable hinzu, dass die Gesamtanzahl bei 8 bleibt.
for (i = 0; i < rowsDeleted; i++)
{
dt.Rows.Add(dt.NewRow());
}
Danach binde ich das GridView an das DataTable:
ViewState["dt"] = dt;
gvCDS.DataSource = dt;
gvCDS.DataBind();
Das GridView hat immer noch 8 Zeilen. Das ist korrekt. Aber das Problem ist, dass das gesamte GridView leer geworden ist. Beim Testen habe ich einige der Zeilen ausgefüllt und nur eine davon ausgewählt. Daher sollten die Inhalte der nicht ausgewählten Zeilen vorhanden sein. Aber das gesamte GridView ist leer. Ich weiß nicht warum. Nicht nur das, ich habe sogar getestet, indem ich alle Zeilen nicht ausgewählt habe, was bedeutet, dass keine Zeile gelöscht wird. Dennoch ist das GridView komplett leer. Wie kann ich dieses Problem lösen? Danke.