Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Mi 20.04.11 11:41 
Mir war nicht bewusst dass du die App Settings verwenden willst; Wie dem aus sei, viel ändert sich nicht am Vorgehen:
ausblenden C#-Quelltext
1:
Properties.Settings.Default.myProperty= "MyNewValue";					

Das Speichert die Settings für die aktuelle Sitzung. Um sie endgültig in die App config zu speichern, musst du sie noch explizit speichern:
ausblenden C#-Quelltext
1:
Properties.Settings.Default.Save();					
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 20.04.11 16:38 
Und genau das macht er schon seit dem ersten Beitrag :nixweiss: ?

@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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.04.11 22:30 
Nein, also da steht nur drin, dass eine DataTable gespeichert wurde, aber keine Daten enthält:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 20.04.11 22:39 
Hallo,
also erstmal: Schreibe mal statt
user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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"));
//Code geändert, da es so nicht gefunzt hätte
lieber
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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.