Avatar billede jackass- Nybegynder
05. marts 2010 - 09:52 Der er 10 kommentarer og
2 løsninger

Opdater controls på Form2 fra Form1

Hej,

Fra Form1 vil jeg gerne oprette en instans af Form2 (et "details" vindue med en ricktextbox på) men ikke vise den - det gør jeg senere.

Fra en eventhandler kan jeg godt "Form2 fd = new Form2(this);" for at sende en reference med.. og i så fald virker fd.ShowDialog(); også.

Men kan jeg ikke oprette instansen allerede når programmet startes og så fra forskellige funktioner og handlers m.v. kalde "fd.textbox.text += "blabla\r\n"; " eller lignende?
Avatar billede jackass- Nybegynder
05. marts 2010 - 10:13 #1
Har også prøvet at erklære form2 globalt:

    public partial class MyProg : Form
    {
        Form2 fd;

..og i MyProg_Load() dette: "fd = new FormDetails(this);"

Men hvis jeg så bruger "fd.richTextBoxLog.AppendText(my_string);" får jeg fejlen {"Object reference not set to an instance of an object."}

Men jeg kan vel ikke bruge "fd = new Form2(this);" hver eneste gang jeg skal access Form2.. så bliver der jo hundredvis af instanser? :/
Avatar billede Syska Mester
05. marts 2010 - 10:23 #2
Hvor kalder du:
fd.richTextBoxLog.AppendText(my_string);

Virker måske som om du gør det før formen er blevet initialiseret med dine controls.

( lang tid siden jeg har leget med winforms, er med Init af controls ikke i load? Husk at InitializeControls eller hvad den hedder skal kaldes før du kan tilføje ting til din RTF box.

mvh
Avatar billede jackass- Nybegynder
05. marts 2010 - 10:32 #3
Her laver jeg instancen af Form2:

private void MyProg_Load(object sender, EventArgs e)
{
    ...
    fd = new Form2(this);
}

Og en (eller flere) andre steder skal jeg bruge den.. som fx:

public void DoCopyFiles()
{
    ... her kopierer vi nogle filer osv
    fd.richTextBox1.AppendText("Fil X blev kopieret fra Y til Z\r\n");
}

Og så har brugeren mulighed for at se en log af fx ved:

private void detailsToolStripMenuItem_Click(object sender, EventArgs e)
{
    fd.ShowDialog();
}
Avatar billede Syska Mester
05. marts 2010 - 10:44 #4
Hej,

Hvis du har lavet din egen overload ...

Husker du så at kalde default constructoren også ?
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

public Form1(DinAndenForm form) : this()
{
// din extended logic her
}
    }
Avatar billede jackass- Nybegynder
05. marts 2010 - 10:59 #5
Er desværre ikke helt med :-/ Du får lige lidt mere her.. det er hvad jeg har med de rigtige form navne osv:


namespace UMUpdater
{
    public partial class UMUpdater : Form
    {
        FormDetails fd;

        public UMUpdater()
        {
            InitializeComponent();
        }
        public UMUpdater(FormDetails form) : this()
        {
        }
        /* Begin copying files etc. */
        public void DoCopyFiles()
        {
            // copy files here..

            FormDetails fd = new FormDetails(this);
            fd.richTextBox1.AppendText("success/failed info");
        }
        private void detailsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormDetails fd = new FormDetails(this);
            fd.ShowDialog();
        }

}

Nu får jeg godt nok ingen fejl længere.. men når FormDetail vises, er rickTextBox1 helt tom, så noget går der da galt :-/
Avatar billede Syska Mester
05. marts 2010 - 11:05 #6
Hvad er FormDetails ? Skal du ikke gemme den reference, du opretter den jo igen og igen ... og så er det klart at hvad der bliver skrevet til den bliver slettet.

Kan du ikke poste alt kode på http://nomorepasting.com/ sidder og gætter mig i vilde her ....

mvh
Avatar billede jackass- Nybegynder
05. marts 2010 - 11:13 #7
FormDetails er den form jeg før refererede til som Form2..

Vil desværre være ked af at smide alt koden lige i dette tilfælde, selvom jeg godt ved det nok ikke er nemt at hjælpe så.. :/
Avatar billede platik Nybegynder
05. marts 2010 - 11:59 #8
Nogen grund til du ikke bare laver en public metode på din form2 som tilføjer text til din textbox?

Ex:
Skrives i FormDetails
public void SkrivTilTextbox(string text)
{
    richTextBox1 += text;
}

Skrives i UMUpdater:
fd.SkrivTilTextbox("din tekst string");

Er ikke helt med på hvorfor du vil sende din form1 over til form2, hvornår bruger form2 form1?
Avatar billede Syska Mester
05. marts 2010 - 12:25 #9
FormMain skriver til FormDetails ?

Men er det ikke din FormMain som skal skrive log til din FormDetails ?

Hvis, så gør som "platik" skriver, opret en public method på din FormDetails ....

og opret FormDetails i din FormMain og gem referencen, så du kan vise den form når brugeren klikker på din knap.

mvh
Avatar billede jackass- Nybegynder
05. marts 2010 - 13:49 #10
Dooh.. selvfølgelig da, så føler man sig ikke ret dum vel? Godt det er fredag :-/

Tak skal I have begge to, vil I smide svar :-)
Avatar billede platik Nybegynder
05. marts 2010 - 17:50 #11
Svar :-)
Avatar billede Syska Mester
05. marts 2010 - 18:02 #12
svar
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