Autor Beitrag
mindhunter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 23.09.21 17:49 
Hallo liebes Forum,

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[i].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

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[i].ColumnName + " ");     /* Spaltenname*/
        Console.WriteLine(table.Rows[j].ItemArray[i] + " ");  /* Spaltenwert*/

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


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4562
Erhaltene Danke: 946


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 23.09.21 18:17 
Ein Form (oder jedes andere Container Control) hat eine Controls Property mit den direkt auf im enthalten Controls und eine Array Indexer für den Namen des Controls.
Wenn du dir also den Controlnamen baust (ohne das .Text der Property) solltest du über

ausblenden C#-Quelltext
1:
2:
var ctrl = myLovelyForm.Controls["txt_" + table.Columns[i].ColumnName];
ctrl.Text = table.Rows[j].ItemArray[i];


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.
mindhunter Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 24.09.21 17:43 
Hallo Ralf,

lieben Dank für die gesuchte Lösung. Leider funktioniert der Lösungsvorschlag nicht. Vielleicht sollte ich mir, deinem Vorschlag folgend eine andere Lösung ausdenken. Die Problemstellung ist einfach: Über ein Formular sollen Daten in eine SQL-DB geschrieben werden. Die einfachsten Aufgaben geschalten sich manchmal als doch nicht so einfach!

Liebe Grüße
Stefan