c# using serialisation

moshpitMajor

New member
Joined
Nov 9, 2022
Messages
2
Programming Experience
Beginner
class store

{
private int runningNumber;
private List<Objekt> listObjekt;


XmlSerializer serializer = new XmlSerializer(typeof(List<Objekt>));

public int Anzahl
{
get
{
return listObjekt.Count;
}
}

public List<Objekt> ListObjekt { get => listObjekt; set => listObjekt = value; }



ich such nach einer einfachen Lösung und komme leider nicht mehr weiter. Sicherlich weis das Forum einen Rat.
Über eine Klasse lese ich einen Datensatz aus einer SQL-DB und möchte die Werte in Formularfelder schreiben. In dem Table-Object habe ich die Spaltennamen und die Werte. Mit z.B. einer For-Schleife sollen die Werte in die dazugehörigen Textboxen geschrieben werden. Der Name der Textbox soll sich aus “txt_“ und DB-Spaltenname zusammensetzen, also: “txt_“ + ColumnName.

Den Spaltenname habe ich bereits (["txt_" + table.Columns.ColumnName + ".Text"]) nur die Textboxen lassen sich nicht ansprechen.

Sicherlich habt ihr dazu eine einfache Lösung!

DB-Spaltenname: Modell
WindowsForm Textboxname: txt_Modell
DB-Spaltenname: Farbe
WindowsForm Textboxname: txt_Farbe

markieren
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
DataTable table = new DataTable();
table = DBHelperClass.Get_DataTable("SELECT * FROM [testtabelle] WHERE user ='test'");

for (int j = 0; j < table.Rows.Count; j++)
{
for (int i = 0; i < table.Columns.Count; i++)
{
Console.Write(table.Columns.ColumnName + " "); /* Spaltenname*/
Console.WriteLine(table.Rows[j].ItemArray + " "); /* Spaltenwert*/

var text = "txt_" + table.Columns.ColumnName + ".Text";
}
}



public void Loading()
{
TextReader reader = new StreamReader("Objects.xml");
ListObjects = (List<Objekt>) serializer.Deserialize(reader);
reader.Close();
runningNumber= ListObject.Last().Nummer;

}

public void ArtikelSpeichern()
{

TextWriter writer = new StreamWriter("Object.xml");
serializer.Serialize(writer, ListObject);
writer.Close();
}

public void adding(string , decimal)
{
Object new = new Objekt(runningNumber+1, name, price);
listObject.Add(neu);

}

public void del (Object object)
{
ListObject.Remove(object);
}
}

code behind

Store store;

public Form1()
{
InitializeComponent();
store = new Store();
}

private void buttonAdd_Click(object sender, EventArgs e)
{
store.ArtikelAdd(textBoxArticleAdd.Text, Convert.ToDecimal(textBoxPrice.Text));
update();
}


1:
2:
var ctrl = myLovelyForm.Controls["txt_" + table.Columns.ColumnName];
ctrl.Text = table.Rows[j].ItemArray;


den Text setzen könne.
Name des Controls meint hier den Inhalt der Name Property des Controls nicht den Variablennamen der auf der Form benutzt wird. Der ist hier irrelevant.
Im Standardfall wenn man die Form über den Winforms Designer gebaut hat ist das aber gleich.
Wenn du deine Textboxen auf anderen ContainerControls verteilt hast (Panels, GroupBoxen etc.) dann reicht es nicht in Form.Controls zu schauen dann musst du explizit die ContainerControls durchsuchen bzw. recursiv die ControlsCollection der Controls von Form aus durchsuchen.


Allgemein halte ich dieses vorgehen für problematisch. Das ist scheinbar dynamisch ist es aber nicht wirklich, du musst ja schon die passenden Textboxen haben.
Insofern geht es hier nicht um beliebige Tabellen bzw. Daten sondern um einen sehr konkreten Fall.
Dann kann man sich auch eine passende Struktur ausdenken zum Beispiel ein Klasse auf die man die Rows mappt und dann sauber per Databinding in die Controls bekommt.
Das was du da gerade baust ist ein Maintainance Horror.



private void update()
{
comboBoxArticel.DataSource = null;
comboBoxArticle.DataSource = store.ListArticle;
textBoxArticlemuch.Text = lager.Anzahl.ToString();

}

private void buttonLoeschen_Click(object sender, EventArgs e)
{
aktualisieren();
lager.ArtikelLoeschen((Artikel)comboBoxArtikel.SelectedItem);
aktualisieren();
}

private void buttonSpeichern_Click(object sender, EventArgs e)
{
aktualisieren();
lager.ArtikelSpeichern();
}

private void buttonLaden_Click(object sender, EventArgs e)
{
lager.ArtikelLaden();
aktualisieren();
}
 
Unfortunately, this site is an English language forum. Please post your question in English. Also please put your code in code tags so that proper formatting/indentation is retained.
 
Back
Top Bottom