none
Как вызвать методы класса Form1 из другого класса в C# ? RRS feed

  • Вопрос

  • Имеем вот такую программку. Тут я упростил до минимума, чтобы был явно виден вопрос:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApplication1
    {
      
    
      public partial class Form1 : Form
      {
        public Form1()
          {
            InitializeComponent();
          }
    
        public void Metod(string s)
        {
          s = s + s;
          this.textBox1.Text = s;
    
        }
    
        private void label1_Click(object sender, EventArgs e)
        {
          Metod("Вы шелкнули по надписи");
          Thread.Sleep(5000);
          Klass1 KL = new Klass1();
          KL.metodTwo();
          
        }
      }
    
      public class Klass1
      {
        public void metodTwo()
        {
          Form1.Metod("Этот текст из стороннего обьекта");
        }
      }
    }
    
    

    Строка: Form1.Metod("Этот текст из стороннего обьекта") - вызывает ошибку:

    An object reference is required for the non-static field, method, or property 'WindowsFormsApplication1.Form1.Metod(string)'

    Метод:

    public void Metod(string s)
        {
          s = s + s;
          this.textBox1.Text = s;
    
        }
    
    

    делать статическим - нежелательно. Этот вариант уже испробован, возможно какие нибудь есть другие варианты? Как обратиться к методам и полям Form1 из другого обьекта?

    13 марта 2011 г. 18:13

Ответы

  • Варианты:

    1. передать делегат в конструктор Klass1 (от NIKkakNIK)

    2. передать ссылку на Form1 целиком в конструктор Klass1.

    3. добавить в Klass1 событие (event) и в коде Form1 подписаться на него.

    4. вытащить ссылку на форму из System.Windows.Forms.Application.OpenForms[]


    My blog
    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:54
    14 марта 2011 г. 10:00
  • Спасибо за ответ. Но тут же возникает вопрос - как я понимаю, при запуске программы, уже создается экземпляр Form1. А если я создам новый объект, то  строка: this.textBox1.Text = s; эта операция будет применена к новому обьекту и не будет иметь с существующей начальной Form1 - ничего общего - элемент textBox1 - не изменит своего значения в начальной Form1.

    Если метод public void metod(string s) - сделать статическим, тут же возникает проблема к обращению элементам окна textBox1, так как в статическом методе по определению нельзя использовать this. А кроме как обращения через this, к элементам окна (editBox1) начальной формы - незнаю. Замкнутый круг....(((((

    Возможно есть какая либо переменная, на которую ссылается построенная при запуске программы форма???

    А как насчет механизма событий?  Применимы ли они в данном случае? Если можно - напишите код - буду очень благодарен!

    public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          KL = new Klass1();
          KL.NewEvent += new Klass1.NewHandler(Metod);
        }
    
        Klass1 KL;
    
        public void Metod(string s)
        {
          // s = s + s;
          this.textBox1.Text +="\r\n"+s;
    
        }
    
        private void label1_Click_1(object sender, EventArgs e)
        {
          Metod("Вы шелкнули по надписи");
          Thread.Sleep(5000);
          // Klass1 KL = new Klass1();
          KL.metodTwo();
        }
      }
    
      public class Klass1
      {
        public delegate void NewHandler(string s);
        public event NewHandler NewEvent;
    
        public void metodTwo()
        {
          NewEvent("Этот текст из стороннего обьекта");
          // Form1.Metod("Этот текст из стороннего обьекта");
        }
      }
    

    • Предложено в качестве ответа NIKkakNIK 14 марта 2011 г. 8:50
    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:54
    14 марта 2011 г. 8:50
  • Экземпляр Form1 создается при запуске, если это прописано в функции Main, которая вызывается при запуске всей программы.

    Предположим экземпляр действительно создается. Тогда Вам надо передавать указатель на этот объект в конструктор класса Klass1 и сохранять этот указатель внутри нового объекта. После чего можно вызывать все методы этого объекта.

     

     class Class2
        {
            private Form1 Form1 { getset; }
     
            public Class2(Form1 f)
            {
                Form1 = f;
            }
     
            public void ЭтотМетодНаходитсяВДругомКлассе()
            {
                Form1.Method("Этот текст из стороннего обьекта");
            }
        }

     

    Теперь ты можешь внутри класса использовать все содержимое другого объекта, указатель на который ты передал в конструктор.

    Blog: svyatoslavpankratov.blogspot.com
    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:54
    14 марта 2011 г. 8:54
  • public partial class MainForm : Form
    {	public static MainForm Instance;
    	public MainForm	()
    	{	InitializeComponent();
    		Instance=this;
    	}
    	public void Metod(string s)
    	{	textBox1.Text = s;
    	}
    	private void label1_Click(object sender, EventArgs e)
    	{	Klass1 KL = new Klass1();
    		KL.metodTwo();
    	}
    }
    public class Klass1
    {	public void metodTwo()	{	MainForm.Instance.Metod("Этот текст из стороннего обьекта");	}
    }
    

     

    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:55
    14 марта 2011 г. 9:09

Все ответы

  • Нужно вначале создать экземпляр класса, а потом уже вызывать его методы.

     

    Form1 f = new Form1();
    f.Metod("Этот текст из стороннего обьекта");

     

    Какой-либо метод допустимо вызывать без создания экземпляра этого класса только если он объявлен как статический.


    Blog: svyatoslavpankratov.blogspot.com
    13 марта 2011 г. 20:32
  • Спасибо за ответ. Но тут же возникает вопрос - как я понимаю, при запуске программы, уже создается экземпляр Form1. А если я создам новый объект, то  строка: this.textBox1.Text = s; эта операция будет применена к новому обьекту и не будет иметь с существующей начальной Form1 - ничего общего - элемент textBox1 - не изменит своего значения в начальной Form1.

    Если метод public void metod(string s) - сделать статическим, тут же возникает проблема к обращению элементам окна textBox1, так как в статическом методе по определению нельзя использовать this. А кроме как обращения через this, к элементам окна (editBox1) начальной формы - незнаю. Замкнутый круг....(((((

    Возможно есть какая либо переменная, на которую ссылается построенная при запуске программы форма???

    А как насчет механизма событий?  Применимы ли они в данном случае? Если можно - напишите код - буду очень благодарен!

    14 марта 2011 г. 6:30
  • Спасибо за ответ. Но тут же возникает вопрос - как я понимаю, при запуске программы, уже создается экземпляр Form1. А если я создам новый объект, то  строка: this.textBox1.Text = s; эта операция будет применена к новому обьекту и не будет иметь с существующей начальной Form1 - ничего общего - элемент textBox1 - не изменит своего значения в начальной Form1.

    Если метод public void metod(string s) - сделать статическим, тут же возникает проблема к обращению элементам окна textBox1, так как в статическом методе по определению нельзя использовать this. А кроме как обращения через this, к элементам окна (editBox1) начальной формы - незнаю. Замкнутый круг....(((((

    Возможно есть какая либо переменная, на которую ссылается построенная при запуске программы форма???

    А как насчет механизма событий?  Применимы ли они в данном случае? Если можно - напишите код - буду очень благодарен!

    public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          KL = new Klass1();
          KL.NewEvent += new Klass1.NewHandler(Metod);
        }
    
        Klass1 KL;
    
        public void Metod(string s)
        {
          // s = s + s;
          this.textBox1.Text +="\r\n"+s;
    
        }
    
        private void label1_Click_1(object sender, EventArgs e)
        {
          Metod("Вы шелкнули по надписи");
          Thread.Sleep(5000);
          // Klass1 KL = new Klass1();
          KL.metodTwo();
        }
      }
    
      public class Klass1
      {
        public delegate void NewHandler(string s);
        public event NewHandler NewEvent;
    
        public void metodTwo()
        {
          NewEvent("Этот текст из стороннего обьекта");
          // Form1.Metod("Этот текст из стороннего обьекта");
        }
      }
    

    • Предложено в качестве ответа NIKkakNIK 14 марта 2011 г. 8:50
    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:54
    14 марта 2011 г. 8:50
  • Экземпляр Form1 создается при запуске, если это прописано в функции Main, которая вызывается при запуске всей программы.

    Предположим экземпляр действительно создается. Тогда Вам надо передавать указатель на этот объект в конструктор класса Klass1 и сохранять этот указатель внутри нового объекта. После чего можно вызывать все методы этого объекта.

     

     class Class2
        {
            private Form1 Form1 { getset; }
     
            public Class2(Form1 f)
            {
                Form1 = f;
            }
     
            public void ЭтотМетодНаходитсяВДругомКлассе()
            {
                Form1.Method("Этот текст из стороннего обьекта");
            }
        }

     

    Теперь ты можешь внутри класса использовать все содержимое другого объекта, указатель на который ты передал в конструктор.

    Blog: svyatoslavpankratov.blogspot.com
    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:54
    14 марта 2011 г. 8:54
  • public partial class MainForm : Form
    {	public static MainForm Instance;
    	public MainForm	()
    	{	InitializeComponent();
    		Instance=this;
    	}
    	public void Metod(string s)
    	{	textBox1.Text = s;
    	}
    	private void label1_Click(object sender, EventArgs e)
    	{	Klass1 KL = new Klass1();
    		KL.metodTwo();
    	}
    }
    public class Klass1
    {	public void metodTwo()	{	MainForm.Instance.Metod("Этот текст из стороннего обьекта");	}
    }
    

     

    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:55
    14 марта 2011 г. 9:09
  • Варианты:

    1. передать делегат в конструктор Klass1 (от NIKkakNIK)

    2. передать ссылку на Form1 целиком в конструктор Klass1.

    3. добавить в Klass1 событие (event) и в коде Form1 подписаться на него.

    4. вытащить ссылку на форму из System.Windows.Forms.Application.OpenForms[]


    My blog
    • Помечено в качестве ответа Abolmasov Dmitry 14 марта 2011 г. 12:54
    14 марта 2011 г. 10:00
  • Ооо, спасибо большое!!!! Использовал первый вариант - все работает как часы))) Я уж думал надолго застряну, а время поджимает - дипломная через 2 мес.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApplication1
    {
      public delegate void deleg(string S);
      
    
      public partial class Form1 : Form
      {
        public Form1()
          {
            InitializeComponent();
          }
    
    
        public void Metod(string s)
        {
    
          this.textBox1.Text += s + "\r\n";
          
        }
    
    private void button1_Click(object sender, EventArgs e) { Metod("Вы шелкнули по надписи"); Thread.Sleep(1000); deleg A = new deleg(this.Metod); Klass1 KL = new Klass1(A); KL.metodTwo(); } } public class Klass1 { public deleg B; public Klass1(deleg A) { B = A; } public void metodTwo() { B("Этот текст из стороннего обьекта"); } } }

    14 марта 2011 г. 10:50