2008-10-20 1 views
24

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

An object reference is required for the non-static field, method, or property 'Project.Form1.txtLog'

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

ответ

28

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

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

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

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

или разоблачающие свойства на вашем классе формы и настройка форма текст там - например

string SomeProperty 
{ 
    get 
    { 
     return textBox1.Text; 
    } 
    set 
    { 
     textBox1.Text = value; 
    } 
} 
+0

В "textBox1.Text = value", откуда берется значение? – user128807 2010-12-29 16:13:06

+0

Как я могу обновить данные сетки с помощью этого метода? – 2011-04-12 14:44:10

9
  1. вы должны иметь ссылку на объект формы для того, чтобы получить доступ к его элементам
  2. элементы должны быть объявлены общественности для того, чтобы другой класс, чтобы получить доступ к ним
  3. не делают это - ваш класс должен знать слишком много о том, как ваша форма реализована; не выставляйте элементы управления формы за пределами класса формы
  4. вместо этого, сделайте общедоступные свойства в своей форме, чтобы получить/установить интересующие вас значения.
  5. Опубликовать более подробную информацию о том, что вы хотите, и почему это звучит так, как будто вы можете отправиться в направлении, которое не согласуется с передовой практикой инкапсуляции
3

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

например ...

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

Form1.txtLog.Text = "blah" 

вместо

Form1 blah = new Form1(); 
blah.txtLog.Text = "hello" 
1

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

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

гр

14

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

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"; 
    } 
} 
2

Если форма запускается первой, в форме 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(); 
    } 
} 
1

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

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

0

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

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 

ВНУТРИ КЛАСС КАК ВАМ СОЗДАТЬ class1

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

Смежные вопросы