Avatar billede anders_cp Nybegynder
19. februar 2009 - 16:28 Der er 8 kommentarer og
1 løsning

Overførsel af parametre via Windows-forms

Hej
Kan nogen sige mig hvordan jeg overfører en variabel fra en form til en anden? Jeg tænker mig det gøres ved ShowDialog(). Men hvordan?


HOVEDFORM
        private void buttonEdit_Click(object sender, EventArgs e)
        {
            int test = 33;
            FormEditModel formeditmodel = new FormEditModel();
            formeditmodel.ShowDialog();
        }


Hvordan får jeg fat i test(eller en hvilken som helst anden)-variablen i formen FormEditModel?
Avatar billede aaberg Nybegynder
19. februar 2009 - 16:37 #1
Du opretter en property på din formeditmodel form, og sætter den, før du åbner formen.

        private void buttonEdit_Click(object sender, EventArgs e)
        {
            int test = 33;
            FormEditModel formeditmodel = new FormEditModel();
            formeditmodel.TestProperty = test;
            formeditmodel.ShowDialog();
        }
Avatar billede aaberg Nybegynder
19. februar 2009 - 16:38 #2
Ellers skal du lave en ny konstruktør på din FormEditModel, så ville det se sådan ud:

        private void buttonEdit_Click(object sender, EventArgs e)
        {
            int test = 33;
            FormEditModel formeditmodel = new FormEditModel(test);
            formeditmodel.ShowDialog();
        }
Avatar billede mr_falle Nybegynder
19. februar 2009 - 16:38 #3
Hej

Du kan gøre det sådan:

I form2:

        public Form2(string x)
        {
            InitializeComponent();
            MessageBox.Show(x);
        }

I form1:

f.eks onButton_Click()

form2 nyform = new form2("TEST");
nyform.ShowDialog();

Dette vil vise messagebox med teksten "TEST" når form2 bliver åbnet.
Avatar billede mr_falle Nybegynder
19. februar 2009 - 16:38 #4
Ikke hurtig nok :)
Avatar billede anders_cp Nybegynder
19. februar 2009 - 17:03 #5
Tak skal I have!

Sådan fik jeg løst problemet, hvad der er smartest ved jeg ikke:

HOVEDFORMEN
private void buttonEdit_Click(object sender, EventArgs e)
{
    int test = 33;
    FormEditModel formeditmodel = new FormEditModel(test);
    formeditmodel.ShowDialog();
}

og i form nummer2
    public partial class FormEditModel : Form
    {
        private int nyvar;
        public FormEditModel(int test)
        {
            InitializeComponent();
            nyvar = test;
        }

        private void FormEditModel_Load(object sender, EventArgs e)
        {
            label1.Text = nyvar.ToString();
        }
    }


Hvis I mener det er hul i hovedet vil jeg gerne høre nærmere ;)
-- >aaberg_cc
Læg et svar..
Avatar billede aaberg Nybegynder
19. februar 2009 - 17:09 #6
Det er overhovedet ikke huld i hovedet. Det er præcist sådan man gør det.

Du behøver dog ikke at abonnere på FormEditModal_Load eventet. Du kan godt sætte din label i konstruktøren.

    public partial class FormEditModel : Form
    {
        private int nyvar;
        public FormEditModel(int test)
        {
            InitializeComponent();
            nyvar = test;
            label1.Text = test.ToString();
        }
    }

Hvis du gør det på denne måde, behøver du heller ikke at have den private nyvar variabel, med mindre du skal bruge den fra flere steder i koden.

Så du kan egentlig nøjes med:
    public partial class FormEditModel : Form
    {
        public FormEditModel(int test)
        {
            InitializeComponent();
            label1.Text = test.ToString();
        }
    }
Avatar billede anders_cp Nybegynder
19. februar 2009 - 17:15 #7
Det var netop fordi jeg skal bruge variablen i koden at jeg lavede det kunststykke.

Nu er det meget små data og små ressourcer der bliver brugt i windows-appl., men jeg var ikke helt tryg ved at have variablen lokalt. Så en lidt bøvlet vej til at undgå dette kunne måske være at:
1) bruge dit sidste forslag
2) lave label1 usynlig
3) hente variablen ind derfra.

men jeg synes selv det lyder bøvlet.

Tak til jer begge for svar ;)
Avatar billede aaberg Nybegynder
19. februar 2009 - 21:49 #8
Der er ingenting i vejen med at have variablen lokalt! Men, aldrig gør en kontrol usynlig, for at have en variabel der. Det er der noget galt i!

En lokal privat variabel er måden at gøre det på, der er ikke nogen alternativer. Der er mange der vælger at pakke den ind i en property, men da vil den stadig ligge i en lokal variabel.

Sådan her, ville det se ud, hvis jeg skulle gøre det.

public partial class FormEditModel : Form
{
  public FormEditModel()
  {
      InitializeComponent();
  }

  public FormEditModel(int tal) : this()
  {
      this.Tal = tal;
  }

  private int _tal;
 
  //Her opretter jeg en property. Denne kan også være
  //protected, internal, protected internal eller private.
  //Når propertien sættes, kommer tallet automatisk ind i labelen.
  public int Tal 
  {
      get
      {
        return _tal;
      }
      set
      {
        _tal = value;
        this.label1.Text = value.ToString();
      }
  }
}


Fra den første form, kan du nu gøre det på 2 måder. Enten:
private void buttonEdit_Click(object sender, EventArgs e)
{
    int etTal = 33;
    FormEditModel formeditmodel = new FormEditModel(etTal);
    formeditmodel.ShowDialog();
}

eller
private void buttonEdit_Click(object sender, EventArgs e)
{
    int etTal = 33;
    FormEditModel formeditmodel = new FormEditModel();
    formeditmodel.Tal = etTal;
    formeditmodel.ShowDialog();
}
Avatar billede anders_cp Nybegynder
19. februar 2009 - 22:07 #9
Tak for den fine kode. Den vil jeg gemme.

Grunden til jeg tænkte som jeg at variablen var global skal ses af #5, hvor variablen er "global" i hele windows-formen.

Men jeg er med på hvad du mener, takket være sidste forklaring ;)
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