Модераторы: gambit, Partizan
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как обратиться из класса к форме? В который раз уже задаю этот вопрос! 
:(
    Опции темы
Валерия
Дата 19.12.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Просьба не говорить что вопрос повторялся.

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

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


Это сообщение отредактировал(а) Валерия - 19.12.2007, 23:26
PM MAIL   Вверх
VisualProgrammerNET
Дата 19.12.2007, 23:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



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

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

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

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


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Валерия
Дата 19.12.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Но ведь textbox1 это не "чертеж" а уже созданный "автомобиль", но к нему не получается из "далека" обращаться smile
PM MAIL   Вверх
VisualProgrammerNET
Дата 19.12.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



Текстбокс - нет. Но как мы к нему приходим?
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) =)

Это сообщение отредактировал(а) VisualProgrammerNET - 19.12.2007, 23:56


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
anonym
Дата 19.12.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: нет
Всего: 3



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

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

Это сообщение отредактировал(а) anonym - 19.12.2007, 23:54
PM MAIL   Вверх
Валерия
Дата 19.12.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Большое спасибо!
PM MAIL   Вверх
informatik
Дата 20.12.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.11.2007

Репутация: 2
Всего: 6



Ну очень странная, и на мой взгляд абсолютно неправильная конструкция конструкция...   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 
--------------------
namespace informatik
PM MAIL   Вверх
D_F_V
Дата 20.12.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 27.3.2007
Где: Vladivostok

Репутация: нет
Всего: 1



Код

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

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

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



Это сообщение отредактировал(а) D_F_V - 20.12.2007, 10:51
PM MAIL ICQ MSN   Вверх
it_medved
Дата 20.12.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



А можно передать 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
PM MAIL WWW   Вверх
mr.DUDA
Дата 20.12.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Тему закрыл как дубликат.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1270 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.