Как получить доступ к методам и элементам управления формы из класса в C #? - PullRequest
25 голосов
/ 20 октября 2008

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

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

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

Ответы [ 8 ]

28 голосов
/ 20 октября 2008

Вы пытаетесь получить доступ к классу, а не к объекту. Это утверждение может сбить с толку новичков, но вы действительно пытаетесь открыть дверь своего дома, подбирая дверь на планах своего дома.

Если вы на самом деле хотели получить доступ к компонентам формы непосредственно из класса (чего у вас нет), вы бы использовали переменную, которая создает экземпляр вашей формы.

В зависимости от того, по какому пути вы хотите пойти, вам лучше либо отправить текст элемента управления, либо что-либо еще в метод в ваших классах, например

public void DoSomethingWithText(string formText)
{
   // do something text in here
}

или выставление свойств вашего класса формы и установка там текста формы - например,

string SomeProperty
{
   get 
   {
      return textBox1.Text;
   }
   set
   {
      textBox1.Text = value;
   }
}
14 голосов
/ 20 октября 2008

Другое решение - передать текстовое поле (или элемент управления, который вы хотите изменить) в метод, который будет манипулировать им как параметром.

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";
    }
}
9 голосов
/ 20 октября 2008
  1. у вас должна быть ссылка на объект формы, чтобы получить доступ к его элементам
  2. элементы должны быть объявлены общедоступными, чтобы другой класс мог получить к ним доступ
  3. не делайте этого - ваш класс должен знать слишком много о том, как реализована ваша форма; не открывать элементы управления формой вне класса формы
  4. Вместо этого, сделайте открытые свойства в своей форме, чтобы получить / установить значения, которые вас интересуют
  5. опубликуйте более подробную информацию о том, что вы хотите и почему, похоже, вы движетесь в направлении, не совместимом с хорошими практиками инкапсуляции
3 голосов
/ 20 октября 2008

Вам нужен доступ к объекту .... вы не можете просто задать класс формы ....

например ...

вы бы сделали что-то вроде

Form1.txtLog.Text = "blah"

вместо

Form1 blah = new Form1();
blah.txtLog.Text = "hello"
2 голосов
/ 13 февраля 2010

Если форма запускается первой, в обработчике загрузки формы мы можем создать копию нашего класса. У нас могут быть свойства, которые ссылаются на те элементы управления, на которые мы хотим ссылаться. Передайте ссылку на форму 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();
    }
}
1 голос
/ 09 декабря 2010

Я относительно новичок в c # и новичок в 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);

Работал для меня, может быть, это поможет в обоих вопросах.

1 голос
/ 20 октября 2008

Вам необходимо сделать члены класса for общедоступными или, если класс обслуживания находится в той же сборке, внутренними. Видимость элементов управления Windows можно контролировать через свойства их модификаторов.

Обратите внимание, что обычно считается плохой практикой явно связывать класс обслуживания с классом пользовательского интерфейса. Скорее вы должны создать хорошие интерфейсы между классом обслуживания и классом формы. Тем не менее, для обучения или просто бездельничания Земля не будет вращаться вокруг своей оси, если вы выставите членов формы для классов обслуживания.

гр

0 голосов
/ 02 января 2014

ПРОСТО ВЫ МОЖЕТЕ ОТПРАВИТЬ ФОРМУ В КЛАСС, КАК ЭТО

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...