Entwickler-Ecke

WinForms - Zugriff auf Textboxen in einem WindowsForm


mindhunter - Do 23.09.21 17:49
Titel: Zugriff auf Textboxen in einem WindowsForm
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


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 - 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


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 - 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