Avatar billede snoozie Nybegynder
07. marts 2005 - 17:36 Der er 16 kommentarer og
1 løsning

Flere forme

Hej

Jeg har for nylig fundet ud af hvordan man åbner en "Form-fil", og det virkede fint, men jeg kan ikke gemme noget i den ene form, og bruge i en anden.

Jeg har prøvet at bruge en "Klasse-fil", men det virker ikke.

Jeg bruger SharpDevelop, i sproget C#.


Hvordan kan man gemme noget i en form, fx noget i en string, og så bruge i en anden form?

På forhånd tak.
Avatar billede arne_v Ekspert
07. marts 2005 - 17:43 #1
Eksempel:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace E
{
    public class MainForm : Form
    {
        private Button button1;
        private TextBox textBox1;
        public MainForm()
        {
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            textBox1 = new TextBox();
            button1 = new Button();
            SuspendLayout();
            textBox1.Multiline = true;
            textBox1.Location = new Point(50, 50);
            textBox1.Size = new Size(200, 50);
            button1.Location = new Point(50, 150);
            button1.Size = new Size(200, 50);
            button1.Text = "Åben sub form";
            button1.Click += new EventHandler(Button1Click);
            ClientSize = new Size(300, 250);
            Controls.Add(button1);
            Controls.Add(textBox1);
            Text = "Main Form";
            ResumeLayout(false);
        }
        public string TB
        {
            get
            {
                return textBox1.Text;
            }
        }
        void Button1Click(object sender, System.EventArgs e)
        {
            SubForm sf = new SubForm(this);
            sf.ShowDialog();
        }
    }
    public class SubForm : Form
    {
        private MainForm mf;
        private TextBox textBox1;
        public SubForm(MainForm mf)
        {
            this.mf = mf;
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            textBox1 = new TextBox();
            SuspendLayout();
            textBox1.Multiline = true;
            textBox1.Location = new Point(50, 50);
            textBox1.Size = new Size(200, 50);
            textBox1.Text = mf.TB;
            ClientSize = new Size(300, 150);
            Controls.Add(textBox1);
            Text = "Sub Form";
            ResumeLayout(false);
        }
    }
    public class TestClass
    {
        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new MainForm());
        }
    }
}
Avatar billede snoozie Nybegynder
07. marts 2005 - 18:03 #2
Ja. Men jeg bruger 1 fil til MainForm, og så 1 fil til den nye form. De ligger alle under samme Combine.

Grunden til dette, er at jeg gerne vil kunne designe det hele lidt nemmere.


Er der nogen måde det kan gøre hvis man bruger en fil til hver sin form, men under samme combine?
Avatar billede arne_v Ekspert
07. marts 2005 - 18:25 #3
Det ændrer jo ikke ret meget - du kan putte klasserne i 3 forskellige filer eller
1 fil - de virker stadigvæk ens.
Avatar billede arne_v Ekspert
07. marts 2005 - 18:25 #4
Eller går spørgsmålet reelt på hvordan du får SharpDevelop til at compile de 2 (eller 3)
filer sammen til en exe ?
Avatar billede snoozie Nybegynder
07. marts 2005 - 18:41 #5
Nej nej, den kan sagtens compile alle forms/filer, mit problem er bare, at hvis jeg gemmer noget i den ene fil/form, så kan jeg ikke hente det i en anden form/fil
Avatar billede arne_v Ekspert
07. marts 2005 - 18:43 #6
Det kan du hvis du gør det på den måde jeg viser:

SubForm sf = new SubForm(this);

hvor

    public class SubForm : Form
    {
        private MainForm mf;
        ...
        public SubForm(MainForm mf)
        {
            this.mf = mf;
Avatar billede arne_v Ekspert
07. marts 2005 - 18:44 #7
du sender en reference til din hoved form med over i constructor til din sub form, som
gemmer den således at sub formens metoder kan kalde metoder/properties på hoved formen.
Avatar billede snoozie Nybegynder
07. marts 2005 - 19:24 #8
Jeg kan ikke helt få det til at virke. Enten er det fordi jeg ikke fatter det, eller også er det fordi jeg skriver noget forkert.

Hvad gør  this.mf = mf;?

den kan ikke finde den label der ligger i mainformen.


MainForm:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace MultipleForms
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public class MainForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Button button1;
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
           
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
   
       
        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new MainForm());
        }
       
        #region Windows Forms Designer generated code
        /// <summary>
        /// This method is required for Windows Forms designer support.
        /// Do not change the method contents inside the source code editor. The Forms designer might
        /// not be able to load this method if it was changed manually.
        /// </summary>
        private void InitializeComponent() {
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(48, 80);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(192, 40);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.Button1Click);
            //
            // label1
            //
            this.label1.Location = new System.Drawing.Point(64, 168);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(152, 24);
            this.label1.TabIndex = 1;
            this.label1.Text = "label1";
            //
            // MainForm
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.button1);
            this.Name = "MainForm";
            this.Text = "MainForm";
            this.ResumeLayout(false);
        }
        void Button1Click(object sender, System.EventArgs e)
        {
            SubForm sf = new SubForm(this);
            sf.ShowDialog();
        }
    }
}

SubForm:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace MultipleForms
{
    /// <summary>
    /// Description of SubForm.
    /// </summary>
    public class SubForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        private MainForm mf;
        public SubForm(MainForm mf)
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
           
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
       
        #region Windows Forms Designer generated code
        /// <summary>
        /// This method is required for Windows Forms designer support.
        /// Do not change the method contents inside the source code editor. The Forms designer might
        /// not be able to load this method if it was changed manually.
        /// </summary>
        private void InitializeComponent() {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(56, 64);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(192, 64);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.Button1Click);
            //
            // SubForm
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.button1);
            this.Name = "SubForm";
            this.Text = "SubForm";
            this.ResumeLayout(false);
        }
        #endregion
       
        void Button1Click(object sender, System.EventArgs e)
        {
            label1.Text = "der virker";
        }
       
    }
}

Hvad har jeg gjort galt? SubForm og MainForm er 2 filer for sig selv.
Avatar billede arne_v Ekspert
07. marts 2005 - 19:27 #9
Du mangler den her linie:

this.mf = mf;

som er den der gemmer referencen.
Avatar billede arne_v Ekspert
07. marts 2005 - 19:28 #10
Og så mangler du at lave eb public property i main formen som sub formen kan bruge
Avatar billede snoozie Nybegynder
07. marts 2005 - 19:29 #11
Hvad er eb public property? Og hvor skal det stå henne?
this.mf = mf; - hvor skal det stå henne? i SubForm filen?
Avatar billede arne_v Ekspert
07. marts 2005 - 19:31 #12
public SubForm(MainForm mf)
        {
            this.mf = mf; // <---- her
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
         
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
Avatar billede arne_v Ekspert
07. marts 2005 - 19:33 #13
public String Label1
{
  get
  {
      return label1.Text;
  }
  set
  {
      label1.Text = value;
  }
}
Avatar billede arne_v Ekspert
07. marts 2005 - 19:33 #14
den skal ind i MainForm
Avatar billede arne_v Ekspert
07. marts 2005 - 19:33 #15
Så kan du i SubForm:

        void Button1Click(object sender, System.EventArgs e)
        {
            mf.Label1 = "det virker";
        }
Avatar billede snoozie Nybegynder
07. marts 2005 - 19:55 #16
Ja, nu virker det! Nu forstår jeg det du sagde med referencer.

Sidste spørgsmål. Hvis jeg nu vil lukke SubForm når jeg trykker på kanppen, så virker det ikke helt på den måde jeg kender. Hvordan gøres det?

Tak for hjælpen, smid et svar
Avatar billede arne_v Ekspert
07. marts 2005 - 20:07 #17
Jeg er ikke sikker på hvad du vil.

Måske skal du kalde:
  this.Dispose();
??

Og 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