Лучший отвечающий
Как вызвать методы класса Form1 из другого класса в C# ?

Вопрос
-
Имеем вот такую программку. Тут я упростил до минимума, чтобы был явно виден вопрос:
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 { get; set; } 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.com13 марта 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 { get; set; } 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