Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Mo 18.04.11 17:49
Hi.
Kann mir jemand erklären, wie ich die Daten, die vom Benutzer in einem DataGridView eingegeben werden in den Settings speichern kann?
Ich habe nun schon dutzende Sachen probiert mit DataSource, BindingSource, DataTable, etc., aber in keinem Fall wurden die Werte beim nächsten Start des Programmes wieder eingelesen. Ist es überhaupt möglich die Eingaben im DGV ohne das expliziete Erstellen einer Datenbank oder XML Datei zu speichern?
Falls es geht, welchen Typ muss ich denn in den Settings hinterlegen, sodass ich da wenigstens einen Anhaltspunkt habe und probieren kann?
MfG BlackMatrix
edit:
Wollte das ganze so aufbauen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| DataTable DataTable { get; set; } public MainForm() { InitializeComponent(); DataTable = Settings.Default.DataTable; if (DataTable == null) CreateTable(); dataGridView1.DataSource = DataTable; }
private void CreateTable() { DataTable = new DataTable(); DataTable.Columns.Add("username", Type.GetType("System.String")); DataTable.Columns.Add("password", Type.GetType("System.String")); }
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { Settings.Default.DataTable = DataTable; Settings.Default.Save(); } |
Funzt aber nicht 
|
|
IsNull
      
Beiträge: 97
Erhaltene Danke: 11
VS 2010, C#, AHK
|
Verfasst: Di 19.04.11 09:11
Ich nutze DatagridViews auch in den WindowsForms am liebsten Objekt gebunden.
D.h. dein DGV stellt einfach eine List<T>/BindingList<T> von dir definierten Objekten dar.
So ist die Logik vom Speichern der Daten nicht mehr in der nähe des DGV sondern liegt beim Objekt welches deine Liste verwaltet.
Beispiel:
www.switchonthecode....view-to-a-collection
Hast du das soweit, stehst du vor dem Problem, deine Objekte zu speichern. Und das machst du - gerade bei "Settings" am besten über XML Serialisierung deiner Objekte.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Di 19.04.11 22:53
Aber was ich nicht verstehe, wieso kann man in den Settings einen Typ DataTable anlegen, wenn die Daten in einer DataTable nicht in den Settings übernommen werden? Oder mache ich doch nur irgendetwas falsch?
Ich dachte eigentlich auch, dass es einmal funktioniert hat, aber ich denke, dass ich da einfach vergessen habe mein Methode CreateTable(); auszukommentieren und dadurch das DGV wieder gefüllt war.
Was ich jedoch nicht ganz verstehe bei deinem Beispiel, worin liegt jetzt der Vorteil? Dann könnte ich ja auch gleich eine XML File schreiben und das einfach beim Start wieder einlesen, aber ich wollte das ganze ja wie gesagt gerne in den Settings "verstecken".
|
|
IsNull
      
Beiträge: 97
Erhaltene Danke: 11
VS 2010, C#, AHK
|
Verfasst: Mi 20.04.11 11:41
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 20.04.11 16:38
Und genau das macht er schon seit dem ersten Beitrag  ?
@BlackMatrix: DataTables habe ich noch nie in Settings geschrieben, aber hast du einmal nachgesehen, ob die Settings-Datei in %APPDATA% überhaupt durch Save verändert wird?
_________________ >λ=
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Mi 20.04.11 22:30
Nein, also da steht nur drin, dass eine DataTable gespeichert wurde, aber keine Daten enthält:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <configuration> <userSettings> <Test.Properties.Settings> <setting name="Setting" serializeAs="String"> <value>stringTest</value> </setting> <setting name="DataTable" serializeAs="Xml"> <value /> </setting> </Test.Properties.Settings> </userSettings> </configuration> |
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mi 20.04.11 22:39
Hallo,
also erstmal: Schreibe mal statt
BlackMatrix hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4: 5:
| DataTable table = new DataTable(); table.Columns.Add("username", Type.GetType("System.String")); table.Columns.Add("password", Type.GetType("System.String")); | |
lieber
C#-Quelltext 1: 2: 3:
| DataTable table = new DataTable(); table.Columns.Add("username", typeof(string)); | Aber das nur mal am Rande. Nun zum Thema.
Dass die Settings einen komplexen Datentyp wie eine DataTable unterstützt ist mir neu und glaube ich ehrlich auch nicht so ganz. Denn eigentlich kann man nur simple Datentypen darin speichern (wenn ich falsch liege, bitte berichtigt mich!).
Also wenn ich das so richtig gedeutet habe, so musst Du die Table als string serialisiert in den Settings ablegen. Und das klappt auch.
Hier mal ein paar Methoden dafür:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| private DataTable CreateTable() { DataTable table = new DataTable("Table"); table.Columns.Add("username", typeof(string)); table.Columns.Add("password", typeof(string)); return table; }
private DataTable GetFilledTable() { DataTable table = CreateTable(); using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(Settings.Default.DataTable))) table.ReadXml(stream); return table; }
private void WriteTableToSettings(DataTable table) { using (MemoryStream stream = new MemoryStream()) { table.WriteXml(stream); stream.Position = 0; Setting.Default.DataTable = Encoding.UTF8.GetString(stream.ToArray()); Settings.Default.Save(); } } | LG
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Mi 20.04.11 23:20
Oh, vielen Dank für die Hilfe.
Den Code, den du berichtigt hast, den habe ich von der MSDN Seite genommen, deswegen hat es mich schon ein wenig gewundert, dass der nicht so optimal ist.
Den Rest werde ich morgen mal testen, wobei ich feststellen muss, dass es wohl das beste sein wird, dass man einfach die DataTable als XML ablegt, beim FormClosing schreibt und im Konstruktor einliest.
Schade, weil die Settings mir irgendwie gefallen :]
|
|
IsNull
      
Beiträge: 97
Erhaltene Danke: 11
VS 2010, C#, AHK
|
Verfasst: Do 21.04.11 07:25
Zitat: | Und genau das macht er schon seit dem ersten Beitrag ? |
Ja ne, aber eben mit einer DataTable. Der Witz von einer Objekt gebundenen View ist ja, dass das gebundene Objekt einen Adapter zwischen dem DGV und den zu manipulierenden Daten darstellt - gerade bei Settings wo man nicht direkt darauf binden kann bez. wo noch weitere Aktionen nötig sind, hielt ich das für sinnvoller.
|
|