Führt man nun über ein weiteres Steuerelement der Seite eine Aktion aus, die einen Postback mit sich bringt, wird das Grid neu an die Datenquelle gebunden und zuvor gemachte Eingaben sind verloren. Also doch der ViewState? Nein, lieber nicht. Um dieses Problem (was eigentlich keines ist) zu umschiffen habe ich folgende Klasse erstellt, welche vorhandene, aber nicht gespeicherte Angaben des Grids in der entsprechenden Datenquelle, dem DataView vornimmt, ganz ohne Viewstate.
Public Class UpdateView Private _grid As RadGrid Private _assignments As SortedDictionary(Of String, String) = New SortedDictionary(Of String, String) Public Property Assignments As SortedDictionary(Of String, String) Get Return _assignments End Get Set(value As SortedDictionary(Of String, String)) _assignments = value End Set End Property Public ReadOnly Property Grid As RadGrid Get Return _grid End Get End Property Public Sub New(ByVal grid As RadGrid) Me._grid = grid End Sub Public Sub Update(ByRef dataView As DataView) Dim oldCulture As System.Globalization.CultureInfo = dataView.Table.Locale dataView.Table.Locale = New System.Globalization.CultureInfo("en-US") 'sonstige Änderungen übernehmen ohne MegaByte Weise Viewstate für's RadGrid For Each p As String In HttpContext.Current.Request.Params 'Request Parameter itereieren If p.Contains(_grid.UniqueID) Then 'prüfen ob der der aktuelle Eintrag zum RadGrid gehört Dim a = _grid.FindControl(p.Replace(_grid.UniqueID & "$", "")) 'das entsprechende Steuerelement finden If a IsNot Nothing Then If Assignments.Keys.Contains(a.ID) Then 'prüfen ob das Steuerelement zu aktualisieren ist Dim row = CType(a.Parent.NamingContainer, GridDataItem).ItemIndex 'entsprechende Row des RadGrids ermitteln dataView.Table.Rows(row).Item(Assignments(a.ID)) = HttpContext.Current.Request.Params(p) 'DataView-Feld mit dem entsprechenden Datum aktualisieren End If End If End If Next 'Ende dataView.Table.Locale = oldCulture End Sub End Class
Anschließend kann man je nach Belieben bestimmte Werte im Grid, bzw. der dazugehörigen DataView aktualisieren, sodass beim Laden die Datenbindung an eine aktualisierte View erfolgt.
Warum ich in obigem Beispiel die Culture der DataView auf "en-US" setze und später wieder auf die eigentliche Kultur, erklärt sich im Artikel "CultureInfo: Chaos im .Net"
Beispiel:
Dim updateView As LCT.Tools.UpdateView = New LCT.Tools.UpdateView(RadGrid) updateView.Assignments.Add("GridEditItemID1", "DataViewColumnName1") updateView.Assignments.Add("GridEditItemID2", "DataViewColumnName2") updateView.Update(DataView)
Keine Kommentare:
Kommentar veröffentlichen
Feel free to comment...