Подтвердить что ты не робот

Как получить доступ к методам формы и элементам управления из класса в С#?

Я работаю над программой на С#, и сейчас у меня есть один Form и несколько классов. Я хотел бы иметь доступ к некоторым элементам управления Form (например, TextBox) из моего класса. Когда я пытаюсь изменить текст в TextBox из моего класса, я получаю следующую ошибку:

Ссылка на объект требуется для нестатического поля, метода или свойства "Project.Form1.txtLog"

Как я могу получить доступ к методам и элементам управления, которые находятся в Form1.cs из одного из моих классов?

4b9b3361

Ответ 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, и вы можете получить доступ к другим мудрым, вы не можете видеть элемент управления в форме из класса