C# config

Hallo :smile:

Ich würde gerne für mein Programm eine kleine Config sprich eine kleine ini Datei basteln.

Was die ini Datei mit dem Programm zusammen machen soll:

-das Programm soll beim Programmstart die ini Datei lesen.
-das Programm soll beim drücken eines Buttons die ini Datei neu schreiben…sprich alte werte werden übernommen, neue werte werden überschrieben…

In die ini Datei soll:
-größe des Fensters (windows forms)
-der Status der in einer combobox als „Start“ wert angeben ist

Ich habe sowas noch nie gemacht und frage mich wie dies Funktioniert.
Ich würde mich sehr über einen kleinen code bzw. einen kleinen Denk anstoß oder sonstiges freuen.

so weit bin ich bis jetzt gekommen

private DataTable getSettingsTable(string path)
{
DataTable settingsTable = new DataTable("settings");

if(File.Exists(path)
{
 settingsTable.LoadXML(path);
}
else
{
 // Datei existiert noch nicht - Erstellen der Spalten 
 settingsTable.Columns.Add("SettingName");
 settingsTable.Columns.Add("SettingValue");

 //Anlegen der default-Werte
 DataRow row = settingsTable.NewRow();
 row["SettingName"] = "WindowSize";
 row["SettingValue"] = "500|500";

 settingsTable.Rows.Add(row);

 row = settingsTable.NewRow();
 row["SettingName"] = "ComboBoxValue";
 row["SettingValue"] = "";

 settingsTable.Rows.Add(row);

 settingsTable.WriteXml(path);
}

return settingsTable;
}

das funktioniert ja auch soweit, wenn ein die Datei nicht da ist wird die neugeschrieben…aber wenn sie da ist…also beim auslesen…da gibt es einen fehler…ich weiß nicht was daran falsch ist…

loadXml gibt es nicht…bei nur Load gibt er sofort einen Fehler…und bei ReadXml gibt er einen Fehler wenn er an der stelle angekommen ist…

was kann ich machen? ist das komplett falsch? oder kann ich das zum größten teil so benutzen? könnte mir einer helfen?

Danke im vorraus

mit Dataset !?
Hi,

nimm doch immer ein Dataset. Wenn du feste Einstellungen hast könntest du ein typisiertes Dataset nehmen.
Und bau da deine Table rein usw.

Und dann WriteXML und ReadXML auf dem Dataset Objekt.

Das wäre die elegante Lösung.

Die nicht so elegante wäre … lass deinen Code und nimm den Code hier.

if (File.Exists(path))
{
//Dataset läd XML Datei
DataSet ds = new DataSet();
ds.ReadXml(path);

//Läd die Tabelle
if(ds.Tables.Count == 0)
{
//TODO: Fehlerbehandlung
}
else
{
settingsTable = ds.Tables[0];
}
}

danke schonmal :wink:

er liest jetzt die schonmal die datei…

aber er setzt nicht die größe auf in diesem fall auf 500 * 500

und auch kein „Start“ Status wird gesetzt…

könntest du mir da vllt auch noch helfen?

Größe ? Status ?
Wer soll auf die Größe gesetzt werden? Dein Form?

du kannst es setzen mit …
this.Size = new Size(500, 500);
und statt 500,500 eben deine Werte.
Allerdings brauchst du die als int Wert.
Entweder du trennst deinen string in der Mitte und castest dann die beiden strings zu int…

string newSize = „500|500“; //aus der Row
string newWidth = newSize.Substring(0,3);
string newHeight = newSize.Substring(4, 3);
this.Size = new Size(Convert.ToInt32(newWidth),Convert.ToInt32(newHeight));

oder du nimmst 2 Rows statt 1.
WindowSizeWidth and WindowSizeHeight.
Und dann castest du die beiden Werte. Du ersparst dir den Substring.

Und Status? Von was?
Dat versteh ich net.

mfg
Martin

Tipp: für Suche nach einem Wert in SetttingTabelle
Du hast 2 Spalten Name und Value.
Naja okay. Kann man machen.

Du mußt aber um eine Eigenschaft zu suchen alle Rows durchgehen bis dein Parameter in der Spalte Name auftaucht.
Aber es muss gewährleistet sein das der Wert in der Spalte Name wirklich einmalig ist. Sonst höhrt deine Suche früher auf als gedacht.

Was du machen kannst um einmal die Tabelle zu lesen und dann schnell auf Eigenschaften drauf zu kommen kannst du das hier nehmen.

//das hier global deklarieren
private Dictionary settingListe = new Dictionary();

//das hier in eine Funktion packen oder direkt nach dem Lesen deiner //Tabelle ausführen
foreach (DataRow row in deineTabelle.Rows)
{
settingListe.Add(row[„Name“].ToString(), row[„Value“].ToString());
}

//und nun kannst du nach deinem Begriff suchen wo auch immer
string windowSizeWert = settingListe[„WindowSize“];

sorry ich bin nur ein praktikant^^ der das als aufgabe bekommen habe…und ich MUSS das unbedingt schaffen…

also das ist ja jetzt mein code:

private DataTable getSettingsTable(string path)
 {

 path = @"C:\settings.xml";
 DataTable settingsTable = new DataTable("settings");

 if (File.Exists(path))
 {
 //Dataset läd XML Datei
 DataSet ds = new DataSet();
 ds.ReadXml(path);

 //Läd die Tabelle 
 if (ds.Tables.Count == 0)
 {
 //TODO: Fehlerbehandlung
 }
 else
 {
 settingsTable = ds.Tables[0];
 }
 }
 else
 {
 // Datei existiert noch nicht - Erstellen der Spalten 
 settingsTable.Columns.Add("SettingName");
 settingsTable.Columns.Add("SettingValue");

 //Anlegen der default-Werte
 DataRow row = settingsTable.NewRow();
 row["SettingName"] = "WindowSize";
 row["SettingValue"] = "10|10";

 settingsTable.Rows.Add(row);

 row = settingsTable.NewRow();
 row["SettingName"] = "ComboBoxValue";
 row["SettingValue"] = "";

 settingsTable.Rows.Add(row);

 settingsTable.WriteXml(path);
 }

 return settingsTable;
 }

wo muss ich das jetzt einsetzen?

könntest du mir das vllt freundlicher weise zeigen?

Hi,

private DataTable getSettingsTable(string path)
{

path = @„C:\settings.xml“;

path = @„C:\settings.xml“;
is quatsch - du übergibst den string doch irgendwo.

Es ist doch eine Methode die irgendwo aufgerufen wird.
Und die gibt eine Datatable zurück.

Z.B steht irgendwo

DataTable dt = getSettingsTable(@„C:\settings.xml“);
Oder nicht?
Okay …

Und nun machst du 2 Funktionen

private Dictionary settingListe = new Dictionary();
private void SetSettingDictonary(DataTable dt)
{
//Mein Tipp
foreach (DataRow row in dt.Rows)
{
settingListe.Add(row[„SettingName“].ToString(), row[„SettingValue“].ToString());
}
}

private void SetSettings()
{
//hier das setzen aller Eigenschaften
string newSize = settingListe[„WindowSize“]
string newWidth = newSize.Substring(0,3);
string newHeight = newSize.Substring(4, 3);
this.Size = new Size(Convert.ToInt32(newWidth),Convert.ToInt32(newHeight));

//Status?
}

Und dort wo du das stehen hast …
DataTable dt = getSettingsTable(@„C:\settings.xml“);
Machst du jetzt noch …
SetSettingDictonary(DataTable dt); //Um die Werte vernüftig zu laden
SetSettings(); //Die Eigenschaften setzen

Fertig.

So, komplett verwirrt oder gehts?

sorry aber ich denke ich bin wirklich zu „dumm“ :smiley:

meins raus deins rein…UND

er sagt mir bei

string newSize = settingListe["WindowSize"];

und bei

settingListe.Add(row["SettingName"].ToString(), row["SettingValue"].ToString());

einen Fehler

ich hatte voher stehen

private void Form1\_Load(object sender, EventArgs e)
 {
 DataTable dt = getSettingsTable(@"C:\settings.xml");

 }

private DataTable getSettingsTable(string path)
 {


 DataTable settingsTable = new DataTable("settings");

 if (File.Exists(path))
 {
 //Dataset läd XML Datei
 DataSet ds = new DataSet();
 ds.ReadXml(path);

 //Läd die Tabelle 
 if (ds.Tables.Count == 0)
 {
 //TODO: Fehlerbehandlung
 }
 else
 {
 settingsTable = ds.Tables[0];
 }
 }
 else
 {
 // Datei existiert noch nicht - Erstellen der Spalten 
 settingsTable.Columns.Add("SettingName");
 settingsTable.Columns.Add("SettingValue");

 //Anlegen der default-Werte
 DataRow row = settingsTable.NewRow();
 row["SettingName"] = "WindowSize";
 row["SettingValue"] = "10|10";

 settingsTable.Rows.Add(row);

 row = settingsTable.NewRow();
 row["SettingName"] = "ComboBoxValue";
 row["SettingValue"] = "";

 settingsTable.Rows.Add(row);

 settingsTable.WriteXml(path);
 }

 return settingsTable;
 }

ich bin nun wirklich komplett von der rolle :smiley:

.NET Konfigurationsmodell
Für Konfigurationsdateien bietet das .NET-Framework ab Version 2.0 eine supereinfache Lösung. Mit Visual Studio (auch Express) ist das ganz easy. Die konfigurationsdateien sind im XML-Format. Du kannst die Größe dann direkt als Size-Objekt speichern, das ist aber nur einer der vielen Vorteile gegenüber selbstgebastelten Lösungen.
Siehe: http://www.mycsharp.de/wbb2/thread.php?threadid=6439

Grüße, JasonDelife.

Un nochmal … falls du deine Variante durchziehen willst.

Alles was du stehen hast, stimmt doch soweit.
Das kannst du doch lassen.

Du hast die beiden Funktionen rein kopiert und die globale Variable (Dictionary) ???

und in deinem Load Event nach deinem Aufruf von LoadSetting hast du die beiden Aufrufe gemacht, richtig?
DataTable dt =
getSettingsTable(@„C:\settings.xml“);
… hier die beiden anderen Aufrufe.

was bringt er denn für einen Fehler?
Daraus solltest du schon den Fehler erkennen.

mfg
Martin

ich danke euch beiden für die hilfe „erstmal“

ich hab das jetzt soweit hinbekommen…

was das .NET nicht alles für möglichkeiten bietet :wink: