Avatar billede Slettet bruger
23. marts 2008 - 23:57 Der er 20 kommentarer og
1 løsning

Kalde funktion på en Form fra en anden?

Hello, World!

Hvordan kalder jeg en funktion på en Form fra en anden?
Hvis jeg nu for eksempel har koden:

static class Program
{
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}

Og:

public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
public void SomeMethod()
{
Close(); // Eller noget andet
}
}

Og sidst:

public partial class SomeOtherForm : Form
{
public SomeOtherForm
{
InitializeComponent();
// Her vil jeg så kalde MainForm's SomeMethod
}
}
Avatar billede arne_v Ekspert
24. marts 2008 - 00:03 #1
SomeOtherForm skal have en reference til en MainForm instans.
Avatar billede Slettet bruger
24. marts 2008 - 00:09 #2
Ja, tænkte jeg nok. Men hvordan gør man det? Navngiver instansen af MainForm på en måde?
Avatar billede arne_v Ekspert
24. marts 2008 - 00:28 #3
f.eks.:

public SomeOtherForm(MainForm mf)
{
    InitializeComponent();
    mf.SomeMethod();
}

og så laver du i MainForm kode:

SomeOtherForm sof = new SomeOtherForm(this);
Avatar billede Slettet bruger
24. marts 2008 - 01:02 #4
Selvfølgelig :) Tak.
Men ville det ikke være lidt mere sofistikeret og OOP-mæssigt ideelt at give instansen af MainForm et navn og referere til det? Jeg ved godt, det sikkert ikke er smart i realiteten, men måske burde det være sådan?
Avatar billede arne_v Ekspert
24. marts 2008 - 01:33 #5
private MainForm mf;
public SomeOtherForm(MainForm mf)
{
    this.mf = mf;
    InitializeComponent();
    mf.SomeMethod();
}

vil gøre at du kan bruge mf i andre metider i SomeOtherForm.
Avatar billede Slettet bruger
24. marts 2008 - 09:25 #6
Okay... Jeg kan bare ikke forstå, hvorfor det skal være nødvendigt at have bruge et argument og ikke bare tilgå den anden Form direkte.
Nå, skidt med det. Der er sikkert en god grund til det, så jeg bruger bare den første løsning.
Og så kan du vist godt lægge et svar :P
Avatar billede arne_v Ekspert
24. marts 2008 - 12:45 #7
kommer her
Avatar billede arne_v Ekspert
24. marts 2008 - 12:46 #8
Taenk paa at du kan have to instanser af MainForm - hvilken af dem skulle du bruge ved
kald ??
Avatar billede Slettet bruger
24. marts 2008 - 19:27 #9
Så ville man jo give dem forskellige navne?
Avatar billede arne_v Ekspert
25. marts 2008 - 01:29 #10
Samme klassenavn.

Og man skal have en reference for at en instans har et navn.
Avatar billede Slettet bruger
28. marts 2008 - 21:08 #11
Hm, jeg har et problem. Den kan ikke finde funktionen :S

Jeg tror, jeg ved hvorfor:

SomeOtherForm's constructor er
public SomeOtherForm(MainForm mf)
{
    this.mf = mf;
    InitializeComponent();
}

Så variablen mf gemmes i instansen.
Når jeg så anvender den i en event... Lad os lige lave en demo

public Eventz(/*og saa en masse her der i dette tilfaelde er ligegyldigt*/)
{
    mf.SomeMethod();
}

Det virker ikke! Den fejler under compile og siger, at mf.SomeMethod er ukendt.
Hvad skal jeg gøre?
Avatar billede arne_v Ekspert
28. marts 2008 - 22:55 #12
Har MainForm en SomeMethod metode uden argumenter ?
Avatar billede Slettet bruger
28. marts 2008 - 23:02 #13
Ja. Og der er ingen overloads.
Avatar billede arne_v Ekspert
29. marts 2008 - 03:01 #14
Og den er public ?
Avatar billede Slettet bruger
29. marts 2008 - 10:09 #15
Jep.
Avatar billede Slettet bruger
29. marts 2008 - 10:11 #16
public void SomeMethod()
{
    Console.WriteLine("Test"); // Skriv til output
    return;
}
Avatar billede arne_v Ekspert
30. marts 2008 - 04:40 #17
Må vi se lidt mere kode ?

Fordi som det er beskrevet så kan det ikke passe.
Avatar billede Slettet bruger
30. marts 2008 - 13:19 #18
Jo, jeg samler lige det hele.
Avatar billede Slettet bruger
30. marts 2008 - 14:43 #19
Form 1
------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Root
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        public void UpdateEventList()
        {
            // Dette er metoden
            return;
        }

        private void Button_AddEvent_Click(object sender, EventArgs e)
        {
            Form2 F2 = new Form2(this);
            F2.ShowDialog();
            return;
        }
    }
}


Form 2
------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace Root
{
    public partial class Form2 : Form
    {
        public Form Main;
        public Form2(Form main)
        {
            InitializeComponent();
            Main = main;
        }

        private void Button_Accept_Click(object sender, EventArgs e)
        {
            Main.UpdateEventList();
            Close();
        }

        private void Button_Cancel_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}
Avatar billede arne_v Ekspert
30. marts 2008 - 20:50 #20
public Form Main;
        public Form2(Form main)
        {
            InitializeComponent();
            Main = main;
        }

->

        public MainForm Main;
        public Form2(MainForm main)
        {
            InitializeComponent();
            Main = main;
        }

skulle gerne fixe den.
Avatar billede Slettet bruger
30. marts 2008 - 20:59 #21
Selvfølgelig.
Mange tak :)
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