Laden...

TextBox über Variable ansprechen

Erstellt von LeraanLorr vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.947 Views
Hinweis von Abt vor 6 Jahren

Ich hab das Thema abgetrennt von TextBox über Variable ansprechen.

L
LeraanLorr Themenstarter:in
3 Beiträge seit 2017
vor 6 Jahren

Hallo zusammen,

ich bin Blutiger Anfänger und "krampfe" mich gerade durch die C# Programmierung durch.
Nun bin ich an genau an diesem Thema kurz vor der Verzweiflung und benötige Hilfe oder einen Anstoß in die richtige Richtung.

Folgendes Problem:

Ich rufe eine Methode auf und übergebe eine z.B. textbox Namen in der Variable "valueFeldLeer".
Im Grunde will ich hier nur erstmal prüfen, ob i.B. in die textbox, Zeichen eingetragen wurden.

Aber egal was ich ausprobiere, ich bekomme es nicht hin. Mein letzter Ansatz war jetzt die Lösung von herbivore "String Inhalt = Controls [TextBoxName].Text;"

Aber das scheitert kläglich und ich würde mich über Hilfe sehe freuen 😄

         

public void FeldLeer(string valueFeldLeer)         
{             
               ErrorProvider errorProvider1 = new ErrorProvider();
               bool isValid = false;

             if (string.IsNullOrEmpty(Controls[valueFeldLeer].Text))
             {                       
                       Controls[valueFeldLeer].Focus();
                       errorProvider1.SetError(Controls[valueFeldLeer], "Bitte einen Wert eintragen");
                       isValid = false;
             }
             else
             {
                       errorProvider1.SetError(Controls[valueFeldLeer], string.Empty);
                       isValid = true;
              }
}
           

Merci und Gruß

Maurice

3.003 Beiträge seit 2006
vor 6 Jahren

"Ich bekomme es nicht hin" und "das scheitert kläglich" sind keine Fehlermeldungen.

Was hast du probiert, wie ist die Fehlermeldung, und wieso benutzt du nicht einfach direkt die Instanz des Controls?

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
523 Beiträge seit 2008
vor 6 Jahren

Ich sehe mehrere Probleme (wobei wir mangels Fehlerbeschreibung nur raten können):

1.) Den ErrorProvider solltest Du in der Klasse und nicht in der Methode FeldLeer() definieren.


    public partial class Form1 : Form
    {
        ErrorProvider errorProvider1 = new ErrorProvider();
        .......................
    } 

2.) Der Else-Zweig setzt den Error-Provider nicht zurück, so dass das Fehler-Icon neben der Textbox auch angezeigt wird wenn diese nicht leer ist. So wäre es richtig:


        public void FeldLeer(string valueFeldLeer)
        {
            bool isValid = false;

            if (string.IsNullOrEmpty(Controls[valueFeldLeer].Text))
            {
                Controls[valueFeldLeer].Focus();
                errorProvider1.SetError(Controls[valueFeldLeer], "Bitte einen Wert eintragen");
                isValid = false;
            }
            else
            {
                errorProvider1.Clear();
                isValid = true;
            }
        }

1
124 Beiträge seit 2012
vor 6 Jahren

und hier mal ein kleines Beispiel für die Hastable:


        private TextBox txtüberschrift;
        private Hashtable tabelleTextBox = new Hashtable();
        

        public Form1()
        {

            txtüberschrift = new TextBox();
            txtüberschrift.Name = "Überschrift";
            txtüberschrift.Location = new Point(0, 0);
            this.Controls.Add(txtüberschrift);
           

            tabelleTextBox.Add(txtüberschrift.Name, txtüberschrift);

            InitializeComponent();
            
        }

        public void FeldLeer(string valueFeldLeer)
        {
            TextBox textBoxtemp;
            textBoxtemp = (TextBox) tabelleTextBox[valueFeldLeer];
}
16.806 Beiträge seit 2008
vor 6 Jahren

Wenn möglich sollte man die Referenz des Controls (hier eine TextBox) als Identifier nutzen und nicht einen Text, der womöglich auf mehrere Controls passt.

L
LeraanLorr Themenstarter:in
3 Beiträge seit 2017
vor 6 Jahren

Hallo,

ja, in meinem Quellcode ist wahrscheinlich einiges "Katastrophal" und ihr würdet mir sicher davon abraten, weiter zu machen 😉
Aber irgendwie wuschtel ich mich da durch.

Also, meine wirren versuche und die dazu gehörenden Fehlermeldungen kann ich nicht mehr rekonstruieren.
Momentan konzentriere ich mich auf diese Variante um den Inhalt z.B. textbox zu prüfen:



            if (string.IsNullOrEmpty(textBox1.Text))
            {
                textBox1.Focus();
                errorProvider1.SetError(textBox1, "Bitte einen Wert eintragen");
                isValidJN = false;
            }
            else
            {
                errorProvider1.SetError(textBox1, string.Empty);
                isValidJN = true;
            }


Nun Übergebe ich ja den Namen der Textbox über die Variable "valueFeldLeer".
Ich kann aber nicht einfach

if (string.IsNullOrEmpty(textBox1.Text)) durch if (string.IsNullOrEmpty(valueFeldLeer.Text)) ersetzen.

Also aber ich den 11jährigen Vorschlag eingebaut und: if

(string.IsNullOrEmpty(Controls[valueFeldLeer].Text)) 

eingetragen.

VS2017 meldet ersteinmal keinen Fehler aber im Probe Lauf:

Fehlermeldung:
System.NullReferenceException ist aufgetreten.
HResult=0x80004003
Nachricht = Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

H
523 Beiträge seit 2008
vor 6 Jahren

ja, in meinem Quellcode ist wahrscheinlich einiges "Katastrophal" und ihr würdet mir sicher davon abraten, weiter zu machen 😉

Jeder hat mal angefangen 😉

System.NullReferenceException ist aufgetreten.
HResult=0x80004003
Nachricht = Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Poste bitte mehr Quellcode, sonst können wir Dir nicht helfen.

4.931 Beiträge seit 2008
vor 6 Jahren

Warum übergibst du überhaupt den Namen an die Methode, anstatt direkt das Control?


public void FeldLeer(Control control)
{
    if (string.IsNullOrEmpty(control.Text))
    {
        control.Focus();
        errorProvider1.SetError(control, "Bitte einen Wert eintragen");
        isValidJN = false;
    }
    else
    {
        errorProvider1.SetError(control, string.Empty);
        isValidJN = true;
     }
}

Und Aufruf dann z.B.


FeldLeer(textBox1);

PS: Die NullReferenceException erhältst du wahrscheinlich bei deinem Code, weil die TextBox nicht direkt auf der Form sitzt, sondern Teil eines Containers (GroupBox, Panel, ...) ist - denn die Eigenschaft Controls bezieht sich nur auf die direkten Unterelemente!

3.003 Beiträge seit 2006
vor 6 Jahren

Ja, das ist der Grund, wieso man eine Referenz nutzt, und nach Möglichkeit keine Zeichenkette: bei letzterem tauchen Fehler zur Laufzeit auf, nicht schon beim erstellen. [1]

Das wenn möglich von Abt liest du am besten als "so gut wie immer, und für meine Zwecke auf jeden Fall", dieses Gefrickel über den Namen möchtest du nicht, vertrau mir.

Mir ist nicht ganz klar, was dich daran hindert, aus der Methode mit der Signatur

public void FeldLeer(string valueFeldLeer)

eine Methode mit der Signatur

public void FeldLeer(Control control)

zu machen.

LaTino
[1] nennt sich "stringly typed code" und sollte vermieden werden

EDIT: die Signaturänderung ist genau das, was Th69 gemacht hat. Immer schön mit den Objekten arbeiten, und nicht mit Zeichenketten.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

L
LeraanLorr Themenstarter:in
3 Beiträge seit 2017
vor 6 Jahren

Hallo,

ja, dass mit dem "Control" hat funktioniert 😄

Aber nach dem Problem ist vor einem anderen Problem 😉

Ich bedanke mich für eure schnelle Hilfe und werde sicher diese im Laufe dieses Projektes öfter in benötigen.

Merci und Gruß

Maurice