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
TextBox über Variable ansprechen

Moderationshinweis von Abt (26.09.2017 - 14:48:38):

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

LeraanLorr
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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

         

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

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 511
Herkunft: Münster

beantworten | zitieren | melden

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;
            }
        }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hypersurf am .
private Nachricht | Beiträge des Benutzers
123thomas
myCSharp.de - Member



Dabei seit:
Beiträge: 125

beantworten | zitieren | melden

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

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15704
Herkunft: BW

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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:
Fehler
System.NullReferenceException ist aufgetreten.
HResult=0x80004003
Nachricht = Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LeraanLorr am .
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 511
Herkunft: Münster

beantworten | zitieren | melden

Zitat von LeraanLorr
ja, in meinem Quellcode ist wahrscheinlich einiges "Katastrophal" und ihr würdet mir sicher davon abraten, weiter zu machen ;-)

Jeder hat mal angefangen ;)

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

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4001

beantworten | zitieren | melden

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

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Hallo,

ja, dass mit dem "Control" hat funktioniert :-D

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
private Nachricht | Beiträge des Benutzers