Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann ich TextFelder nach Klick auf eine ComboBox automatisch füllen?
Gecko_84
myCSharp.de - Member



Dabei seit:
Beiträge: 2
Herkunft: Deutschland

Themenstarter:

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

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.320

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.961
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von T-Virus am .
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.
private Nachricht | Beiträge des Benutzers
Gecko_84
myCSharp.de - Member



Dabei seit:
Beiträge: 2
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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....
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Gecko_84 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.755

beantworten | zitieren | melden

Zitat von Gecko_84
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?
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 457
Herkunft: Untermeitingen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Anchiko
myCSharp.de - Member



Dabei seit:
Beiträge: 12

beantworten | zitieren | melden

Falls das Thema noch aktuell ist:

Sind Deine Textboxen direkt auf der obersten Ebene der Form angebracht oder liegen Sie in GroupBoxen oder ähnlichem?
private Nachricht | Beiträge des Benutzers