Как получить доступ к методам формы и элементам управления из класса в С#?
Я работаю над программой на С#, и сейчас у меня есть один Form
и несколько классов. Я хотел бы иметь доступ к некоторым элементам управления Form
(например, TextBox
) из моего класса. Когда я пытаюсь изменить текст в TextBox
из моего класса, я получаю следующую ошибку:
Ссылка на объект требуется для нестатического поля, метода или свойства "Project.Form1.txtLog"
Как я могу получить доступ к методам и элементам управления, которые находятся в Form1.cs
из одного из моих классов?
Ответы
Ответ 1
Вы пытаетесь получить доступ к классу, а не к объекту. Это выражение может ввести в заблуждение новичков, но вы действительно пытаетесь открыть дверь своего дома, подняв дверь в планы вашего дома.
Если вы действительно хотели получить доступ к компонентам формы непосредственно из класса (а это не так), вы должны использовать переменную, которая создает вашу форму.
В зависимости от того, каким образом вы хотите идти, вам лучше либо отправить текст элемента управления, либо какой-либо метод в ваши классы, например
public void DoSomethingWithText(string formText)
{
// do something text in here
}
или выставление свойств в вашем классе формы и установка текста формы там - например
string SomeProperty
{
get
{
return textBox1.Text;
}
set
{
textBox1.Text = value;
}
}
Ответ 2
Другим решением было бы передать текстовое поле (или элемент управления, который вы хотите изменить) в метод, который будет манипулировать им как параметр.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TestClass test = new TestClass();
test.ModifyText(textBox1);
}
}
public class TestClass
{
public void ModifyText(TextBox textBox)
{
textBox.Text = "New text";
}
}
Ответ 3
- у вас должна быть ссылка на объект формы для доступа к его элементам.
- элементы должны быть объявлены общедоступными для доступа к ним другого класса
- не делайте этого - ваш класс должен слишком много знать о том, как ваша форма реализована; не выставлять элементы управления формы вне класса формы
- сделайте общедоступные свойства в своей форме, чтобы получить/установить интересующие вас значения.
- опубликуйте более подробную информацию о том, что вы хотите и почему, похоже, что вы можете отправиться в направлении, которое не согласуется с хорошими практиками инкапсуляции.
Ответ 4
Вам нужен доступ к объекту.... вы не можете просто спросить класс формы....
например,...
вы сделали бы что-то вроде
Form1.txtLog.Text = "blah"
вместо
Form1 blah = new Form1();
blah.txtLog.Text = "hello"
Ответ 5
Если форма начинается сначала, в форме Load handler мы можем создать экземпляр нашего класса. Мы можем иметь свойства, которые ссылаются на какие-либо элементы управления, которые мы хотим ссылаться. Передайте ссылку на форму 'this' на конструктор для класса.
public partial class Form1 : Form
{
public ListView Lv
{
get { return lvProcesses; }
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Utilities ut = new Utilities(this);
}
}
В вашем классе ссылка из формы передается в конструктор и сохраняется как частный член. Эта ссылка на форму может использоваться для доступа к свойствам формы.
class Utilities
{
private Form1 _mainForm;
public Utilities(Form1 mainForm)
{
_mainForm = mainForm;
_mainForm.Lv.Items.Clear();
}
}
Ответ 6
Вам нужно сделать члены в классе формы общедоступными или, если класс службы находится в одной сборке, внутренний. Видимость элементов управления Windows можно контролировать с помощью свойств их модификаторов.
Обратите внимание, что обычно считается, что плохая практика явно связывает класс обслуживания с классом пользовательского интерфейса. Скорее вы должны создать хорошие интерфейсы между классом службы и классом формы. Тем не менее, для обучения или просто беспорядка, земля не будет отходить от своей оси, если вы выставляете членов формы для классов обслуживания.
гр
Ответ 7
Я относительно новичок в С# и совершенно новый для stackoverflow. В любом случае, относительно вопроса о том, как получить доступ к элементам управления в форме из класса: я просто использовал класс ControlCollection (Controls) формы.
//Add a new form called frmEditData to project.
//Draw a textbox on it named txtTest; set the text to
//something in design as a test.
Form frmED = new frmEditData();
MessageBox.Show(frmED.Controls["txtTest"].Text);
Работал для меня, может быть, это поможет в обоих вопросах.
Ответ 8
ТОЛЬКО ВЫ МОЖЕТЕ ОТПРАВИТЬ ФОРМУ К КЛАССУ, КАК ЭТО.
Class1 excell = new Class1 (); //you must declare this in form as you want to control
excel.get_data_from_excel(this); // And create instance for class and sen this form to another class
ВНУТРЕННИЙ КЛАСС, КАК ВЫ СОЗДАЕТ КЛАСС 1
class Class1
{
public void get_data_from_excel (Form1 form) //you getting the form here and you can control as you want
{
form.ComboBox1.text = "try it"; //you can chance Form1 UI elements inside the class now
}
}
ВАЖНО: Но вы не должны прощать, что вы объявляете свойства формы модификатора как PUBLIC, и вы можете получить доступ к другим мудрым, вы не можете видеть элемент управления в форме из класса