Laden...

Wie kann ich TextFelder nach Klick auf eine ComboBox automatisch füllen?

Erstellt von Gecko_84 vor 4 Jahren Letzter Beitrag vor 3 Jahren 1.665 Views
G
Gecko_84 Themenstarter:in
2 Beiträge seit 2020
vor 4 Jahren
Wie kann ich TextFelder nach Klick auf eine ComboBox automatisch füllen?

Hallo zusammen,

ich schreibe gerade ein Programm wo aus eingegeben Daten XML Dateien erstellt werden die dann wiederum ausgelesen werden können.

Das Programm selbst funktioniert ohne Probleme doch nun möchte ich ein bisschen Feinabstimmung im Code selbst betreiben und bin gerade etwas am verzweifeln.

Ich habe auf einer Form 30 Textfelder die entweder Sichtbar sind oder auch nicht. Das ganze steuere ich über eine ComboBox, das funktioniert soweit auch.

Nun gibt es auch noch eine CheckBox und ein dazugehöriges Textfeld. Wenn man etwas in das Textfeld einträgt und dann die CheckBox "klickt" soll in allen Sichtbaren Textfeldern der Wert aus dem Textfeld eingetragen werden. Dies versuche ich über eine Methode zu erreichen aber aber irgendwie klappt es nicht.

Vielleicht habt ihr ja eine Idee wo mein Fehler ist... Ich stehe glaube ich gerade auf dem Schlauch....

Anbei ein Auszug aus dem Code.

private void CbYpos_CheckedChanged(object sender, EventArgs e)
        {
            if (CbYpos.Checked)
            {
                foreach (Control c in Controls)
                {
                    if (c is TextBox == Visible && c.Name.Contains("txtypos"))
                    {
                        string ypos;
                        ypos = txtIsYpos.Text;
                        ((TextBox)c).Text = ypos;
                    }
                }
            }
            else
            {
                foreach (Control c in Controls)
                {
                    if (c is TextBox != Visible && c.Name.Contains("txtypos"))
                    {
                        ((TextBox)c).Text = "";
                    }
                }
            }
        } 

Die Methode soll bewirken das wenn die Checkbox aktiviert ist, in allen Textfeldern die im Namen der Textbox "txtypos" enthalten und Sichtbar sind der Wert eingesetzt wird.

Ich danke euch schon mal für eure Kreativen Ideen oder Anregungen.

4.931 Beiträge seit 2008
vor 4 Jahren

Hallo und willkommen,


if (c is TextBox == Visible && c.Name.Contains("txtypos"))

Die Abfrage bzgl. der Sichtbarkeit ist falsch.
Du möchtest


if (c is TextBox && c.Visible && c.Name.Contains("txtypos"))

Analog in der unteren Schleife.

PS: Statt is und nachträgliches Casten ist as besser, s.a. [FAQ] Casten aber richtig: () / is / as.

Oder mit neuerer C#-Version geht auch:


if (c is TextBox textbox)
{
    textbox.Text = ""
}

s.a. C# 7: Is Operator Patterns - You won't need 'as' as often

Btw: Bei Text und Visible kannst du aber ganz auf das Casten verzichten, da diese Eigenschaften schon in Control deklariert sind.

T
2.219 Beiträge seit 2008
vor 4 Jahren

Der Code ist so etwas suboptimal.
Du könntest es auch wie folgt machen.


private void CbYpos_CheckedChanged(object sender, EventArgs e)
{
	foreach (Control c in Controls)
	{			
		TextBox txt = c as TextBox;
		
		// Control ist keine Textbox
		if(txt == null)
			continue;
			
		// Name enthält keine txtypos!
		if(!txt.Name.Contains("txtypos"))
				continue;
			
		if(CbYpos.Checked && txt.Visible)
			txt.Text = txtIsYpos.Text;
		else if(!CbYpos.Checked && !txt.Visible)
			txt.Text = String.Empty;
	}
}

Dann musst du bei Änderungen deiner Logik auch keine Zwei Schleifen pflegen, die im Kern das gleiche machen!

Nachtrag:
Th69 war schneller 😃

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

G
Gecko_84 Themenstarter:in
2 Beiträge seit 2020
vor 4 Jahren

Hallo Ihre beiden,

ich Danke euch beiden für die Hilfreichen Antwort.

@Th69

Die Abfrage hatte ich heute so auch schon, jedoch passiert da nicht wirklich etwas.

Das mit dem "as" statt "is" ist aber ein guter Hinweis den ich mir hinter die Ohren schreiben werde. 😉

@T-Virus

Mit der Logik hast du völlig recht und daher habe ich das auch so direkt mal übernommen.

Auch dazu nochmal vielen Dank für den Hinweis.

Leider besteht das Problem trotzdem, das die Methode nicht das macht was sie soll. Die Textfelder bleiben weiter leer.... Und ich weiß nicht warum, hatte dann ja sogar schon die richtige Lösung drin.

Kann eventuell etwas damit zu tun haben das ich "MetroModernUI" verwende und das deswegen die Controls nicht richtig angesprochen werden?

Vielen Dank nochmal für eure Mühe.

Okay, ich habe es eben mal noch auf einer normalen Form nachgestellt, jedoch mit dem gleichen Ergebnis.

Hat also nicht wirklich was mit der "MetroModernUI" zu tun....

16.807 Beiträge seit 2008
vor 4 Jahren

Und ich weiß nicht warum, hatte dann ja sogar schon die richtige Lösung drin.

Kann eventuell etwas damit zu tun haben das ich "MetroModernUI" verwende und das deswegen die Controls nicht richtig angesprochen werden?

Beides findest Du am schnellsten raus, wenn Du Deinen Code einfach mal debuggst.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

463 Beiträge seit 2009
vor 4 Jahren

Nur als kleiner Hinweis von meiner Seite:

Ich würde **niemals **Logik anhand des **Namens **von Controls abhängig machen. Enweder du erbst z.B. von TextBox und fügst eigene Attribute zur Identifikation ein oder du verwendets das **Tag **Attribute dafür.

A
12 Beiträge seit 2020
vor 3 Jahren

Falls das Thema noch aktuell ist:

Sind Deine Textboxen direkt auf der obersten Ebene der Form angebracht oder liegen Sie in GroupBoxen oder ähnlichem?