Avatar billede noobsaibot Nybegynder
04. maj 2005 - 22:57 Der er 18 kommentarer og
1 løsning

At fylde et Textbox[] med textboxe fra en vilkårlig form

Jeg vil gerne lave et TextBox[] der indeholder alle mine textboxe fra "currentForm" (dvs. den form jeg vælger at kalde metoden med).
Jeg har lidt svært ved at få fyldt mit array med mine textboxe fordi jeg bruger MDI og derved må typecaste.
Når jeg har fyldt mit array vil jeg gerne tjekke én textbox ad gangen for om den er tom.

Jeg har forsøgt mig med nedenstående kode, men jeg får for det første en fejl(Object reference not set to an instance of an object) ved if(tb.Text == ""). For det andet er koden lidt kejtet idet jeg helst ikke vil fylde textboxene ind i array'et "manuelt" ..

Nogen forslag?


-----
kode:
-----


public static void TjekTextBox(Form currentForm)
{
  TextBox[] tbArray = new TextBox[10];
  tbArray[1] = ((FNewCustomer)currentForm).TbFirstName;
           
  foreach(TextBox tb in tbArray)
  {
    if(tb.Text == "")
        {
    MessageBox.Show("Et eller flere felter er ikke udfyldt");
    }
    }
           
}
Avatar billede burningice Nybegynder
04. maj 2005 - 23:46 #1
Hvis du på din form laver en public property der giver adgang til formens control-collection kan du gøre sådan her:

public static void TjekTextBox(Form currentForm)
{
  foreach (Control c in ((FNewCustomer)currentForm).Controls) {
    if (c is TextBox) {
      TextBox txt = (TextBox)c;
      if (txt.Text == "") MessageBox.Show("Et eller flere felter er ikke udfyldt");
    }
  }         
}
Avatar billede segato Nybegynder
05. maj 2005 - 19:30 #2
Hvad med bare at kalde this.Controls og så hente sine textboxe ud på den måde?
Avatar billede burningice Nybegynder
06. maj 2005 - 03:28 #3
måske fordi at TjekTextBox er static, og derfor ikke er en del af noget object ?
Avatar billede nielle Nybegynder
06. maj 2005 - 09:47 #4
Det ser ud til at du tjekker eksternt i forhold til din FnewCustomer-fom. Imidlertid burde et sådant tjek lægge internt som en del af det der sker når der trykkes på ok-knappen:


private void okButton_Click(object sender, System.EventArgs e)
{
    bool EmptyTextBox = false;

    foreach (Control control in Controls)
    {
        if (control is TextBox)
        {
            if (control.Text == null || control.Text.Trim() == "")
            {
                EmptyTextBox = true;
                break;
            }
        }
    }

    if (EmptyTextBox)
        MessageBox.Show("Et eller flere felter er ikke udfyldt");
    else
        this.DialogResult = DialogResult.OK;
}


Bemærk: Hvis du laver "avancerede" ting som at placere nogle af dine TextBox-kontroller inden i f.eks. en GroupBox skal ovesntående kode justeres til at kigge indenfor i disse.
Avatar billede noobsaibot Nybegynder
06. maj 2005 - 10:21 #5
Jeg tror umiddelbart at cyberfessors løsning passer bedst. Skal lige arbejde lidt med den.

segato: Min TjekTextBox-metode ligger i en klasse så derfor kan man ikke bruge this.

nielle: jeg vil gerne have metoden til at virke for flere flere forms, og da jeg anvender Mdi bliver jeg nødt til at typecaste.

:)
Avatar billede nielle Nybegynder
06. maj 2005 - 11:05 #6
Det er ikke nødvendig med at typecase - Controls er tilgængelig i alle Forms.

private void okButton_Click(object sender, System.EventArgs e)
{
    bool EmptyTextBox = TjekTextBox(this.Controls);

    if (EmptyTextBox)
        MessageBox.Show("Et eller flere felter er ikke udfyldt");
    else
        this.DialogResult = DialogResult.OK;
}

- og:

public static bool TjekTextBox(Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is TextBox)
            if (control.Text == null || control.Text.Trim() == "")
                return true;
    }

    return false;
}

Jeg har valgt at bruge en løsning med et flag (EmptyTextBox fro det foregående eksempel) for at undgå at man får en MessageBox for *hver eneste* tom TextBox.
Avatar billede burningice Nybegynder
06. maj 2005 - 11:13 #7
man kunne også lave en return efter man har vist messagebox'en
Avatar billede noobsaibot Nybegynder
08. maj 2005 - 14:37 #8
nielle - jeg har netop placeret nogle af mine textboxe i en groupbox - hvordan tjekker jeg inden for disse groupboxe?
Avatar billede burningice Nybegynder
08. maj 2005 - 16:59 #9
lav en recursive function

public static bool TjekTextBox(Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is GroupBox) TjekTextBox(control.Controls);

        if (control is TextBox)
            if (control.Text == null || control.Text.Trim() == "")
                return true;
    }

    return false;
}
Avatar billede nielle Nybegynder
08. maj 2005 - 17:07 #10
public static bool TjekTextBox(Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is TextBox)
            if (control.Text == null || control.Text.Trim() == "")
                return true;

        if (control is GroupBox)
            foreach (Control controlInGroupBox in control.Controls)
                if (controlInGroupBox.Text == null || controlInGroupBox.Text.Trim() == "")
                    return true;
    }

    return false;
}
Avatar billede nielle Nybegynder
08. maj 2005 - 17:12 #11
cyberfessor> Der var en lille fejl i din kode:

public static bool TjekTextBox(Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is GroupBox)
            if (TjekTextBox(control.Controls) == true)
                return true;

        if (control is TextBox)
            if (control.Text == null || control.Text.Trim() == "")
                return true;
    }

    return false;
}
Avatar billede burningice Nybegynder
08. maj 2005 - 17:47 #12
mon ikke det ville være bedre at skrive

if (control is GroupBox) return TjekTextBox(control.Controls);
Avatar billede burningice Nybegynder
08. maj 2005 - 17:48 #13
nej... det er mig der sover... du har ret, havde bare lige forstået din funktion forkert.
Avatar billede noobsaibot Nybegynder
09. maj 2005 - 01:49 #14
Okay det er virkelig godt! Men egentlig har jeg kun textboxe i groupboxes - kan jeg så ikke skrive:

public static bool TjekTextBox(Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is GroupBox)
            foreach (Control controlInGroupBox in control.Controls)
            if (controlInGroupBox.Text == null || controlInGroupBox.Text.Trim()== "")
                    return true;
    }

    return false;
}
Avatar billede noobsaibot Nybegynder
09. maj 2005 - 03:14 #15
jo det kan jeg godt..
I har begge hjulpet meget. Kan jeg fordele pointene?
Avatar billede burningice Nybegynder
09. maj 2005 - 10:14 #16
ja, så skal vi bare begge lægge et svar
Avatar billede nielle Nybegynder
09. maj 2005 - 10:32 #17
Jeg afstår nu fra point på den her; cyberfessor faktisk var først med kernen af løsningen, og resten er jo bare "afpudsning". :^)
Avatar billede nielle Nybegynder
09. maj 2005 - 10:35 #18
Ang. "09/05-2005 01:49:09" så vil jeg nu ikke råde dig til at gøre det på den måde. Gør det hellere som i "08/05-2005 17:07:16" for så er du fremtidsikret til den dag hvor du beslutter dig for at lave det på en lidt anden måde.
Avatar billede noobsaibot Nybegynder
10. maj 2005 - 01:45 #19
Mange tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB