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.
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.
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.
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....
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
Falls das Thema noch aktuell ist:
Sind Deine Textboxen direkt auf der obersten Ebene der Form angebracht oder liegen Sie in GroupBoxen oder ähnlichem?