Warum ist das DataItem null für ein GridView-Zeile "null", wenn Sie versuchen, änderungen zu speichern?
Also ich hab das GridView auf meiner web-Seite. Es ist Datenbindung, also während der RowDataBound-Ereignis dieser code funktioniert sehr gut:
protected void myGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TimecardApproval shift = (TimecardApproval)e.Row.DataItem;
}
}
Die "shift" - variable hat alle Daten, die ich brauche, funktioniert Super. Aber dann gibt es diesen code für das speichern der Daten:
protected void btnSubmitApprovals_Click(object sender, ImageClickEventArgs e)
{
foreach (GridViewRow item in gvTimeCards.Rows)
{
TimecardApproval shift = (TimecardApproval)item.DataItem;
//code to update the row
}
}
DataItem null ist! Warum? Da das Feld ist, es scheint seltsam, dass es null. Sollte ich Schleifen über etwas anderes?
DataItem
wird bei der Datenbindung. Auf postbacks es ist immer null, bis Sie DataBind
des GridView-Steuerelements wieder. Beachten Sie, dass alle Variablen, die entsorgt werden, am Ende der Seite-Lebenszyklus. Was genau brauchen Sie in btnSubmitApprovals_Click
? Normalerweise erhalten Sie es von den Steuerelementen in der Gebundenen-/TemplateFields.Die Dokumentation sagt: Die DataItem-Eigenschaft ist nur verfügbar, während und nach dem RowDataBound-Ereignis des GridView-Steuerelement. Können Sie das klären, die "nach" - Teil?
Nachdem heißt, nachdem Sie es war-Datenbindung auf der gleichen Seite des Lebens-Zyklus (also bis
Unload
).die ursprüngliche DataItem schien der logischste Weg, um herauszufinden, welche Felder sich geändert hat. Du sagst also ich kann das GridView binden Sie in die click-Funktion?
Nein, Sie können Sie binden das GridView. Dann würden Sie überschreiben alle änderungen und verhindert, dass Ereignisse, die ausgelöst wird. Sie müssen die Auswertung der Kontrollen oder verwenden Sie die GridView
RowUpdating
- Ereignis mit seiner OldValues
und NewValues
Eigenschaften.InformationsquelleAutor TheGerm | 2012-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verstehe, möchten Sie vielleicht, um intellisense von casting-DataItem zu TimeCardApproval. Sie können dies tun, statt. Verwenden Sie die DataKeyNames-zum speichern der Primärschlüssel jede Zeile, die sollte
TimecardApprovalID
und in Ihrem code den Zugriff auf die primären Schlüssel und verwenden Sie es, um die ursprüngliche PositionEinstellung der Tasten
DataKeyField
im markup..Dies funktioniert wie ein Champion für mich, aber ich denke die bessere Methode ist die Verwendung der RowUpdating-Aktion. Auch hatte ich keine problem casting DataItem, aber ich konnte nicht herausfinden, wie man die DataItem-oder wie man einen Verweis, um danach zu suchen. Das DataKey-information war sehr hilfreich. Danke! Konnte, den Sie Bearbeiten, Ihre Antwort zu sagen, "Das ist wie ein Verweis auf das ursprüngliche Element", so akzeptiere ich diese Antwort?
Nur ein follow-up. Eigentlich habe ich diesen Weg nicht gehen, weil die Datenquelle, die das GridView verwendet, verfügt nicht über eine "update" Funktion. Ganz im crash-Kurs in ASP.NET.
Fand diese noch viel mehr helfen: stackoverflow.com/questions/4633261/...
Was zum performance? der Zugriff auf die DB (über die ID) für jede Zeile ? 30 Zeilen, 30-Aufrufe an DB ?
InformationsquelleAutor codingbiz
Vielleicht, diese helfen Ihnen
Grid-Spalte:
Code hinter:
InformationsquelleAutor Spoke
Des gridview-databind-Ereignis ausgelöst, bevor die Schaltfläche klicken. Klingt verrückt, aber das ist asp.net Seite life cycle Verrücktheit.
Versuchen Sie, mit Ihrem code im gridview
RowUpdating
oderRowUpdated
Veranstaltung.Ja,
e.Cancel
ist, was du redest.InformationsquelleAutor boruchsiper