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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратиться к объекту другой формы, очень часто задаваемый вопрос 
V
    Опции темы
Анальгин
Дата 20.5.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Модератор: В данной теме приводятся конкретные советы и решения по поводу "Как из одной формы обратиться к другой форме". Пожалуйста, в поисках ответа внимательно читайте сообщения в этой теме. Повторно заданные вопросы в разделах .NET будут автоматически перенаправляться в эту тему, с закрытием исходных тем.


 Как это на  Дельфи.

Имеем : 

Form1 (Unit1.pas)
Form2 (Unit2.pas)

Чтобы мне из Form1 "видеть" Form2 и все объекты на ней достаточно в Unit1.pas включить строку - 

uses Unit2; 

И теперь я могу, например, сделать так :

Form2.Edit1.Text:='ля-ля-ля';

Каков аналог в C# ?
 
PM MAIL   Вверх
AntonSaburov
Дата 20.5.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Еслиони в одном проекте - то вообще ничего не надо.
Если же в другом

using <Имя проекта>;
PM MAIL WWW ICQ   Вверх
Анальгин
Дата 20.5.2005, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня один проект и в нем 2 формы.
Например пробую изменить Text у textBox1 перед показом 2й формы

Пишу

NewForm frm=new NewForm();
NewForm.textBox1.Text="ля-ля-ля";
frm.ShowDialog();

и получаю
NewForm.textBox1' is inaccessible due to its protection level



PM MAIL   Вверх
AntonSaburov
Дата 20.5.2005, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Так у тебя обявление формы NewForm содержит это поле как protected. Выведи его в public.
PM MAIL WWW ICQ   Вверх
Анальгин
Дата 20.5.2005, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ты имеешь виду это? изменить привате на паблик у техтбокса ?

~~~~~~~~~~ вырезал из листинга второй формы

public class NewForm : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
.....


PM MAIL   Вверх
mr.DUDA
Дата 20.5.2005, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
ты имеешь виду это? изменить привате на паблик у техтбокса ?

Да.

А лучше - создать public-свойство только на чтение, в котором возвращать ссылку на textBox1.


--------------------
user posted image
PM MAIL WWW   Вверх
Анальгин
Дата 20.5.2005, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



меняю на public и в ответ :

F:\.....\Form1.cs(304): An object reference is required for the nonstatic field, method, or property '.....NewForm.textBox1'

mr.DUDA
может конечно лучше, но это не сейчас (сейчас только на 62 странице "полное руководство Visual C#.Net)

Как все гиморно в C# по сравнению с Дельфи smile
PM MAIL   Вверх
AntonSaburov
Дата 20.5.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Цитата
NewForm frm=new NewForm();
NewForm.textBox1.Text="ля-ля-ля";
frm.ShowDialog();


Так надо так:
Код

NewForm frm=new NewForm();
frm.textBox1.Text="ля-ля-ля";
frm.ShowDialog();

PM MAIL WWW ICQ   Вверх
Анальгин
Дата 20.5.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



AntonSaburov огромное спасибо ! все ок.
PM MAIL   Вверх
stab
Дата 21.5.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 7
Всего: 48



Цитата
Как все гиморно в C# по сравнению с Дельфи


Через пару месяцев будешь наоборот думать ;) Всегда сложно учить новое, но как интересно smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Сергей Плоткин
Дата 13.8.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поднимаю. Надеюсь в эту тему кто-нибудь еще заглянет... smile

Начинаю мигрировать C#, тоже с Делфи. Может быть кто-нибудь подскажет решение вышеуказанной задачи (в первом сообщении темы) только с точностью до наоборот:
имеются 2 формы.
на 1-ой textBox1 и button1 (при нажатии создает экземпляр Form2 и показывает), на второй только button1.
Что нужно сделать, чтобы при клике на кнопку button1, находящуюся во 2-ой форме, менялось поле text у объекта textBox1, находящегося на 1-ой (главной) форме?

Буду очень благодарен за помощь.
PM MAIL   Вверх
mr.DUDA
Дата 13.8.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Передаём ссылку на Form1 в конструктор Form2, в обработчике кнопки на форме2 меняем текст в текстбоксе. Текстбокс по-простому можно либо сделать пабликом, либо доступным через открытое св-во.


--------------------
user posted image
PM MAIL WWW   Вверх
Сергей Плоткин
Дата 13.8.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mr.DUDA @  13.8.2006,  19:30 Найти цитируемый пост)
Передаём ссылку на Form1 в конструктор Form2, в обработчике кнопки на форме2 меняем текст в текстбоксе. Текстбокс по-простому можно либо сделать пабликом, либо доступным через открытое св-во. 

Спасибо огромное. Я наконец разобрался. smile

Хотелось бы заметить, что, на мой взгляд, один из главных подводных камней для людей, мигрирующих с дельфей, такой:
VS, в отличие от делфи, не создает автоматически при создании форм экземпляры классов этих форм... + все объекты, переменные, которые мы привыкли создавать в делфи и расчитывать на то, что они будут доступны отовсюду, т.к. по-умолчанию публичны, в C# по-умолчанию защищенные (за точность перевода private не ручаюсь, т.е. доступные только изнутри класса). Может это, конечно, и круто, и отвечает правилам хорошего тона ООП (читал где-то, что общение между разными формами друг с другом напрямую - дурной тон), но мы то к этому настолько привыкли... smile В общем, все это нужно менять на public, чтобы получить-таки доступ к ним.

Это лирическое отступление от новичка для новичков, которые, возможно, набредут на эту тему. Совсем не удивлюсь, если я в чем-то здесь не прав и проявил непонимания основных принципов языка (только азы постигаю), поэтому, если это так, то прошу меня поправить.

mr.DUDA - еще раз большое спасибо!
PM MAIL   Вверх
ivashkanet
Дата 13.8.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
 прошу меня поправить.

Сам просил  smile : 
Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
VS

VS -- это всего лишь крутой "блокнот". Создает все и вся среда .Net (а именно: JTI-компилятор)
Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
в отличие от делфи, не создает автоматически при создании форм экземпляры классов этих форм

Не понял этой фразы smile 
Неужели после объявления класса формы в Дэлфи его экземпляр сразу же начинает существовать?
А как к нему обращаться? По имени класса? 
Тогда для каждой новой формы придется писать свой класс. Так?

Тут все по другому (если я конечно прав выше).
Код

public class form1 : Form
{
// что-нить еще можно написать, но не обязательно :)
}

Это "чертеж" нового "здания" (формы), а не само "здание".
Дальше можно на основании этого "чертежа" возводить сколько угодно новых "зданий".
Код

form1 f  = new form1();
form1 g = new form1();
form1 h = new form1();
form1 j  = new form1();
form1 k = new form1();
form1 l  = new form1();

f, g, k, l --- все РАЗНЫЕ экземпляры форм. Сделанные по общему "чертужу".
И чтобы с ними работать тебе всегда нужна ссылка на конкретный экземпляр. Именно поэтому нужно его передавать другой форме. Чтобы она могла работать с полями текущей формы smile 

Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
+ все объекты, переменные, которые мы привыкли создавать в делфи и расчитывать на то, что они будут доступны отовсюду, т.к. по-умолчанию публичны, в C# по-умолчанию защищенные

Никто ничего не защищал smile 
Просто ты наверное пробовал обратиться к ним через имя класса?
Код

form1.Text = "новое название";


Но ведь form1 --- это чертеж! С ним нельзя работать как с реальным объектом.
Чтобы можно было работать с "чертежом" (самим классом, а не его экземпляром) его элемент(ы) должен быть объявлен как static (т.е. общий для всех экземпляров класса)

Фроде фисё smile  
P.S. В нашем полку прибыло?  smile Добро пожаловать smile  
P.P.S. Код писал по памяти, так что мог где-нить накосячить с синтаксисом  smile 
PM MAIL WWW ICQ   Вверх
Сергей Плоткин
Дата 13.8.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Цитата(ivashkanet @  13.8.2006,  21:46 Найти цитируемый пост)
VS -- это всего лишь крутой "блокнот". Создает все и вся среда .Net (а именно: JTI-компилятор)

Да это я знаю (что это крутой блокнот). smile Но, допустим, я разработчик крутого блокнота "Супер-блокнот". Разве при его разработке я не могу впихнуть в функцию "Создать новый документ" автоматическое вписывание различных строк в документ? Мне же никто не мешает... smile

Цитата(ivashkanet @  13.8.2006,  21:46 Найти цитируемый пост)
Цитата(Сергей Плоткин @  13.8.2006,  21:12)
в отличие от делфи, не создает автоматически при создании форм экземпляры классов этих форм


Не понял этой фразы  
Неужели после объявления класса формы в Дэлфи его экземпляр сразу же начинает существовать?
А как к нему обращаться? По имени класса? 
Тогда для каждой новой формы придется писать свой класс. Так?


В делфи все совсем по-другому. Когда моделируешь форму, ты моделируешь именно экземпляр формы. Т.е. даже свойство "Name" у формы (допустим Form1) в дизайн-тайм - это имя не класса, а именно экземпляра класса TForm1. А класс TForm1 (наследник TForm) создает автоматом. К такому-то принципу я и привык. А в VS (C#, .NET - я уже запутался smile )  надо моделировать именно класс формы и затем создавать ее экземпляр. Нет, это не утомляет и особого труда не занимает, просто ведь "дельфятнику" нужно "дойти" до этого. smile

Насчет чертежей и зданий - я понял. smile Это ж общий принцип.

Цитата
Никто ничего не защищал  
Просто ты наверное пробовал обратиться к ним через имя класса?


Нет, я обращался именно к экземпляру. Я понимаю, что могу свободно редактировать свойства самой формы (экземпляра), например ее заголовок. Зато без танцев с бубном (конечно, уверен со временем мне покажется, что это логично и никак по другому и быть не может) я не могу обратиться к свойствам объекта, лежащего на этой форме.

Цитата
P.S. В нашем полку прибыло?   Добро пожаловать

Спасибо большое за гостеприимство! smile

Это сообщение отредактировал(а) Сергей Плоткин - 13.8.2006, 22:14
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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