Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как обратиться из класса к форме?


Автор: Валерия 19.12.2007, 23:25
Просьба не говорить что вопрос повторялся.

Есть класс, есть форма.
В одном из методов класса есть обращение к объекту формы.
Но:
Код

An object reference is required for the nonstatic field, method, or property 'WindowsApplication14.Form1.textBox1'


Код:

Код

using System;
using System.Windows.Forms;

namespace WindowsApplication14
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            test t1 = new test();
            t1.go();
        }
    }

    class test
    {
        void go()
        {
            WindowsApplication14.Form1.textBox1.Text = "test";
        }
    }
}

Автор: VisualProgrammerNET 19.12.2007, 23:35
Самое важное, что в первую очередь нужно понять при изучении C# - то, что всё является объектами.

Давай представим твой код с точки зрения автомобилестроения. Ты создаёшь класс (а на обыденном языке это будет означать - чертёж, шаблон, схема, как угодно) Автомобиль. В этом чертеже ты прорисовываешь все детали, все контуры, даже все возможные действия автомобиля (например, "открыть дверь"). Но что будет, когда ты попытаешься в своей программе изобразить следующее:
Автомобиль.ОткрытьДверь(). Стоп... Ведь Автомобиль - это всего лишь чертёж. Просто штрихи карандаша на листке бумаги. Как можно сказать листку бумаги с нарисованным автомобилем, чтобы тот открыл дверь? Это, по понятной причине, невозможно. 

Чтобы претворить задумку в жизнь, нужно сперва по чертежу создать автомобиль. Т.е. написать что-то вроде "Автомобиль МойАвто = new Автомобиль(). Отлично! Теперь МойАвто не является чертежом, а именно самой машиной, созданной по этому чертежу. И вот теперь мы можем легко и спокойно приказать МоемуАвто открыть дверь (МойАвто.ОткрытьДверь() ).

Думайте сами, решайте сами  smile 

Автор: Валерия 19.12.2007, 23:37
Но ведь textbox1 это не "чертеж" а уже созданный "автомобиль", но к нему не получается из "далека" обращаться smile

Автор: VisualProgrammerNET 19.12.2007, 23:52
Текстбокс - нет. Но как мы к нему приходим?
WindowsApplication14.Form1.textBox1.Text
Эта Form1 и есть как раз только чертёж формы, но не сама форма! В этом-то и загвоздка  smile 

Добавлю конкретно по данному примеру:

An object reference is required for the nonstatic field, method, or property 'WindowsApplication14.Form1.textBox1' = 
Требуется ссылка на объект для не статического поля, метода или свойства.

Чтобы можно было что-то изменять в классе А из класса Б нужно предоставить сначала классу Б чертёж, по которому он будет знать, что и как работает в классе А. Чтобы работало всё, как положено, следует внести изменения:

1. В классе Form1 создать метод для изменения текста в текстбоксе. Это - инкапсуляция. По умолчанию все контролы создаются с модификатором private, что не позволит менять их из каких-либо других классов. Для изменения мы и создадим данный метод
Код

internal void ChangeTXTboxText(string txt) { this.textBox1.Text = txt; }


2. В классе test создать внутреннюю переменную типа Form1 и параметризованный конструктор, чтобы класс test знал, с чем имеет дело.
Код

private Form1 frm = null;

public test(Form1 usingform) { this.frm = usingform); }


3. Метод go класса test теперь будет иметь вид
Код

this.frm.ChangeTXTboxText("любой_текст");


4. Ну и соответственно создаваться класс test из класса Form1 будет строчкой
Код

test t1 = new test(this);


Вуаля  smile 

ЗЫ. Я конечно щас немного в подпитии... но даже простая проверка в Visual Studio: система IntelliSense (автодополнение) не даст написать такой код... (WindowsApplication14.Form1.textBox1.Text) =)

Автор: anonym 19.12.2007, 23:54
Цитата(Валерия @  19.12.2007,  23:37 Найти цитируемый пост)
Но ведь textbox1 это не "чертеж" а уже созданный "автомобиль", но к нему не получается из "далека" обращаться 

textbox1 это вообще жалкая ручка от двери на чертеже...

Автор: Валерия 19.12.2007, 23:59
Большое спасибо!

Автор: informatik 20.12.2007, 00:07
Ну очень странная, и на мой взгляд абсолютно неправильная конструкция конструкция...   smile 


An object reference is required for the nonstatic field, method, or property 'WindowsApplication14.Form1.textBox1'

Это означает что ты обращаешься к классу как к таковому, а в программе работа осуществляется с объектами класса, которые создаются после запуска программы.
VS ругается что ты пытаешься вызвать статичекий метод, свойство и т.д. которого не существует, и тем более к статическим методам могут обращаться только методы класса.


Вообщето все должно быть ну хотябы так:

Код


namespace WindowsApplication14
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            test t1 = new test();
           TextBox1.text =  t1.go();
        }
    }

    class test
    {
        public string go()
        {
            return "test";
        }
    }
}



Или класс test должен быть тоже формой...

Добавлено через 1 минуту и 48 секунд
Блин пока писал, уже ответили........ нечего было по телефону разговаривать........... smile 

Автор: D_F_V 20.12.2007, 10:49
Код

private Form1 frm = null;
public test(Form1 usingform) { this.frm = usingform); }

В классе можно не указывать начальное значение переменных... ну и this тоже не обязателен...  можно написать так...
Код

private Form1 frm;
public test(Form1 usingform) { frm = usingform); }


Автор: it_medved 20.12.2007, 10:56
А можно передать this по ссылке и обращатся к нему:

Код

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            test t = new test(this);
            t.Go();
        }
    }
    class test
    {
        public Form1 parent = null;
        public test(Form1 par)
        {
            this.parent = par;
        }
        public void Go()
        {
            this.parent.textBox1.Text = "aasdf";
        }
    }

Только textBox1 необходимо сделать public

Автор: mr.DUDA 20.12.2007, 12:51
Тему закрыл как http://forum.vingrad.ru/index.php?show_type=forum&show_topics_from_subforums=&showtopic=52713&view=all.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)