GridView auslesen
-
Montag, 7. Januar 2013 10:15
Hi,
ich habe folgendes Stück Code:
For Each ro As System.Web.UI.WebControls.GridViewRow In myGridView.Rows r0 = ro.Cells(0).Text r1 = ro.Cells(1).Text r2 = ro.Cells(2).Text r3 = ro.Cells(3).Text r4 = ro.Cells(4).Text NextDas Grid ist an eine ArrayList gebunden. Die Spalten 3 und 4 sind mit visible=false definiert. Eigentlich dachte ich, dass ich mit meinem Code oben die werte in den Spalten 3 und 4 auch auslesen kann, aber diese sind leer. Liegt das an visible =false? Wie kann ich es lösen?
Volker
Und Abends ein Glas Wein von AMAVINO
Alle Antworten
-
Montag, 7. Januar 2013 15:01Moderator
Hallo Volker,
es macht eigentlich wenig Sinn, die Zeilen vom Gridview zu durchlaufen und sich von dort irgendwelche Werte zu holen. Sinnvoller wäre es, die Datenquelle des Gridview hierfür zu verwenden.
Beschreib doch mal etwas genauer, für welchen Zweck Du das benötigst, dann kann man dir evtl. auch sagen, wie Du das besser lösen kannst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Montag, 7. Januar 2013 15:23Hallo Stefan,
Im Gridview werden Detail-Datensätze angezeigt/bearbeitet (wie Auftragskopf und Positionen). Nun sollen aber die Detaildatensätze erst in die DB gespeichert werden, wenn der Hauptdatensatz gespeichert wird. Bis zu diesem Zeitpunkt muss alles rückgängig machbar sein.
Das Gridwird mit Daten aus mehreren Tabellen vorbelegt und anschließend bearbeitet.
Die Anzahl der Zeilen im Gridview ist nicht vorhersehbar. Die Daten werden via Linq aus einer SQL-DB zur Verfügung gestellt.
Man könnte natürlich das ganze in einer Datatable/Viewstate zwischenspeichern, aber das erhöht das Datenvolumen doch recht stark, gerade im Hinblick auf den moblien Zugriff.
Volker
Und Abends ein Glas Wein von AMAVINO
-
Montag, 7. Januar 2013 15:30Moderator
Hallo Volker,
ehrlich gesagt hab ich nicht verstanden, was dein o.g. Code mit der Anforderung zu tun hat.
Sendest Du die Detaildatensätze separat? Also vor dem Hauptdatensatz? Falls ja, einzeln? Oder alle auf einmal (auch die nicht geänderten?)
Ich persönlich würde hier zu einer komplett anderen Vorgehensweise raten.
Laden der Daten wie gehabt
-> Anzeige im Gridview
-> Senden der geänderten Daten nicht per Postback (das ist eines der Hauptprobleme bzgl. der Datenübertragung, hier insbesondere der Viewstate), sondern per jQuery.ajax an einen Webservice. Hier werden dann die geänderten Datensätze bspw. per JSON übermittelt und auf dem Server zwischengespeichertWenn nicht in die DB gespeichert werden soll, kannst Du dir die Datensätze serverseitig bspw. in einer List( Of <EigeneKlasse> ) merken, die in der Session abgelegt wird. Wenn dann der Hauptdatensatz kommt, wird dieser gespeichert und anschließend dann alle Unterdatensätze.
Vorteile: Erheblich weniger Traffic, keinerlei Postbackkrams und dadurch viel schnellere Rückmeldung an den Client möglich.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Montag, 7. Januar 2013 15:41
Hallo Stefan,
"Wenn nicht in die DB gespeichert werden soll, kannst Du dir die Datensätze serverseitig bspw. in einer List( Of <EigeneKlasse> ) merken, die in der Session abgelegt wird."das heißt aber, dass ich bei entsprechenden Zugriffen Gefahr laufe, dass mir die Ressourcen auf dem Server ausgehen.
Dann bliebe als sinnvolle und halbwegs performante Lösung nur die temporären Daten in der DB zu speichern.
Richtig?
VolkerUnd Abends ein Glas Wein von AMAVINO
-
Montag, 7. Januar 2013 16:03Moderator
Hallo Volker,
darum empfehle ich bei sowas eigene Datenklassen (bzw. eigentlich generell, die sind dann in der Regel erheblich schlanker als DataSet, DataTable und Co.)
D.h. man bildet die Datenstruktur in Form von Klassen ab. Die Daten an sich kann man dann bspw. als List( Of ... ) zusammenfassen. Nehmen wir einen Datensatz mit ein paar Int64 und zwei, drei String Eigenschaften. Wenn in den Strings bspw. pro Feld 1000 Zeichen stehen, nimmt 1 Datenatz ca. 3 KB in Anspruch. 100 Datensätze ca. 300 KB. Sollten da natürlich exorbitant große Zeichenfolgen drinstehen oder Du dauerhaft zigtausende User gleichzeitig handeln müssen, wird dir irgendwann der Speicher ausgehen. Allerdings denke ich mal, dass hier eher andere Bremsen vorher greifen :)
Eine weitere mögliche Variante wäre auch, die editierten Daten der Detailsdatensätze nicht an den Server zu senden, sondern diese nur per JavaScript auf dem Client vorzuhalten. Dann gibt es auch keinen Engpass auf dem Server. Nachteil dabei wäre, dass der User keinen Seitenwechsel machen kann, ohne die Daten zu verlieren (es sei denn, man würde sie in dem Fall doch zum Server senden).
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Volker Straehle Dienstag, 8. Januar 2013 15:10
-
Dienstag, 8. Januar 2013 15:10Hallo Stefan,
ich habe mich nun für List(Of T) und Viewstate entschieden. Bei Bedarf kann ich dann das ganz relativ einfach noch ausbauen mit http://aspalliance.com/72 aber erst mal "make it run"
VolkerUnd Abends ein Glas Wein von AMAVINO
-
Donnerstag, 31. Januar 2013 14:20
Hallo Volker,
wenn man die Daten einer Spalte wieder verwenden möchte sollte die Visible im Coding erfolgen(seite.cs |seite.vb)
protected void GridView_RowCreated(object sender, GridViewRowEventArgs e){
e.Row.Cells[7].Visible = false
wenn die Spalte in seite.aspx auf Visible=false gesetzt wird, sind die Daten nicht mehr abrufbar.
<asp:BoundField DataField="PersonalNr" Visible="false">
am besten holt man nur die ID der Zeile von GridView und ruft die Daten wieder von (DB oder zwischen gespeicherte Tabelle)

