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

Поиск:

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


Новичок



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

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



Понять что в этом топике описано и повторить что здесь написано  может только тот кто знает и без того как это все делать. 
Прочитал топик уже раз 50 в поисках истины. Попробовал что-то повторить. Увы... 
Уважаемые программисты !
Может кто-нибудь показать на примере как при закрытии кнопкой второй формы передать  значение label.Text формы2 в label.Text формы1
Извиняюсь за тупость.
(не отсылайте к теории и книгам, там о таком к сожалению ничего не написано, по крайней мере для тупых)

PM MAIL   Вверх
ivashkanet
Дата 9.9.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



reg24r, в твоем случае есть два варианта:
1) Показать вторую форму с помощью ShowDialog(), тогда первая форма будет ждать пока закроется вторая, а потом нужные данные "слизать" с закрытого, но еще живого экземпляра второй формы.

Код

Form2 f2 = new Form2();
f2.ShowDialog();
this.Label1.Text = f2.SuperPuperVazhnajaInfa // Все равно откуда мы ее берем :)


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


Код

Form2 f2 = new Form2(this); 
f2.Show(); // дальше вторая форма живет своей жизнью в отдельном потоке,
                 // а не в том же, как при ShowDialog()


Код

class Form2 : Form
{
 private Form1 parentForm;

 public Form2(Form1 parentForm)
 {
          this.parentForm = parentForm;
 }

 private void Form2_OnClose(object sender, e EventArgs)
 {
    parentForm.Label1.Text = this.SuperPuperVazhnajaInfa 
 }
}


P.S. Модераторы: предлагаю очистить эту тему от всего ненужного мусора  smile 
P.P.S. Весь код был написан тут же, так что его скорее всего придеться "доработать напильником" на предмет синтаксических ошибок
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 9.9.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ivashkanet, "мусор" останется, мало ли он кому понадобится smile... А пример твой имхо более чем понятен. Или если что, спрашивайте, reg24r, мы ответим !


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


Новичок



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

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



Оба примера слава богу работают.
Огромное спасибо за помощь.
Преодолена еще одна ступень в ООП.


Вопрос по этому коду

Цитата

class Form2 : Form
{
 private Form1 parentForm;    

 public Form2(Form1 parentForm)
 {
          this.parentForm = parentForm;
 }

 private void Form2_OnClose(object sender, e EventArgs)
 {
    parentForm.Label1.Text = this.SuperPuperVazhnajaInfa 
 }
}



Чем отличается 
Form1 parentForm; 

от

Form1 parentForm = new Form1(); 

Это сообщение отредактировал(а) reg24r - 10.9.2006, 16:48
PM MAIL   Вверх
Exception
Дата 10.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Первый вариант - ты объявляешь переменную. Второй - ты её объявляешь и сразу создаёшь экземпляр, с которым можно работать. В первом варианте в переменной будет хранится null, а во втором - экземпляр класса Form1.
PM   Вверх
ivashkanet
Дата 10.9.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Добавлю еще, что Form1 parentForm = new Form1(); создает совершенно новый экземпляр класса Form1 (читать выше про чертежи и здания). И это будет совсем другая новая форма (брат-близнец главной формы).
Поэтому приходиться передавать ссылку на форму явно Form2 f2 = new Form2(this)
PM MAIL WWW ICQ   Вверх
Lеstat
Дата 16.9.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно тоже вопросик на эту тему...
прочитал и тему, и форум полистал не нашел ответа 

У меня есть главная форма Form1 и еще один класс в отдельном файле
в классе Form1 пишу такую штуку
Код

public void InstallintoDB(String name)
        {
            Log.AppendText("Установка будет произведена в базу " + name + "\n");
        }
Log - это текстовое поле на Form1... 
эта функция вызывается после нескольких других функций, в которых я подключался к БД, настраивал ее и тд
эту функцию мне необходимо выззвать из другого класса...
когда я пишу в другом классе 
Код

            Form1 frm = new Form1();
            frm.InstallintoDB("новая бд");
но как уже заметил ivashkanet создается совершенно новый экземпляр класса Form1 (с Form2 f2 = new Form2(this) не прокатило)
и у меня получается бред...
мне нужно чтобы функция выполнилась так, как-будто я ее в самом же Form1 и вызвал!
раньше я выкручивался через 
Код

internal static void InstallintoDB()
        {
              // но тут нельзя использовать не static объекты!!! а у меня они все не статик
        }
вобщем такая конструкция очень не удобна из-за того что если та не статик объект ошибка получается, а все статиками делать уже сил нет  smile 

Хочу вот узнать как умные люди пишут такие процедуры...

Это сообщение отредактировал(а) Lеstat - 16.9.2006, 18:06
PM MAIL ICQ   Вверх
ivashkanet
Дата 16.9.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Lеstat, надобыло внимательнее читать топик smile
В твоем случае подходит пункт 2 (передача ссылки через конструктор)
Цитата(Lеstat @  16.9.2006,  18:01 Найти цитируемый пост)
но как уже заметил ivashkanet создается совершенно новый экземпляр класса Form1 (с Form2 f2 = new Form2(this) не прокатило)

Интересно почему так не покатило?
Если ты хочешь из Form2 вызвать метод  InstallintoDB первой формы, то пишешь
Код

// Form1
Form2 f2 = new Form2(this) // В этом месте ссылка на первую форму сохраняется в во второй форме

// Form2 
this.ParentForm. InstallintoDB("новая бд")

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


Новичок



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

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



Немного вернусь к первонанальной теме. На форуме были только советы, как обратиться к форме-родителю (поправьте, если что-то пропустил). А что, если в проекте форм эдак 10-15 ? Я предлагаю следующий метод, который, возможно, будет легко понять:

Итак, сначала сделаем static класс, в котором будем хранить список всех форм проекта. Примерно так:
Код

public static class ApplicationFormList
    {
        public static TAdminForm                AdminForm;
        public static TAuthenticationForm   AuthenticationForm;
        public static TBossForm                  BossForm;
        public static TUserForm                  UserForm;
       
        // и так далее
    }
 

Обратите внимание, что мы просто объявляем объекты, не выделяя память, т.е. по сути мы объявляем указатели на формы, которые в момент запуска равны null

Сейчас внесём небольшие изменения в конструкторы каждой из форм, и вместо
Код

public TAdminForm()
        {
            InitializeComponent();
        }


напишем

Код

public TAdminForm()
        {
            InitializeComponent();
            ApplicationFormList.AdminForm = this;
        }


И так для каждой. Иными словами, после создания формы мы из любой другой можем к ней обратиться:

ApplicationFormList .AdminForm.Show();

Можно немного улучшить и проверять, создана ли форма, если вы не делаете этого при старте приложения:

Код

private void button1_Click(object sender, EventArgs e)
        {
            if (ApplicationFormList.AdminForm != null) 
                     ApplicationFormList.AdminForm.Show(); 
            else
                    new TAdminForm().Show();
        }



Как видим, обращение к формам стало очень похоже на Delphi, только перед именем формы пишем имя того static - класса, в котором у нас храниться список форм.

За сим дозвольте откланяться

P.S. Буду только рад замечаниям.


Это сообщение отредактировал(а) vitovt - 3.10.2006, 22:42
PM MAIL   Вверх
ivashkanet
Дата 3.10.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vitovt @  3.10.2006,  11:41 Найти цитируемый пост)
P.S. Буду только рад замечаниям.

А их вроде как и нету smile Кроме как использования вместо поля --- пропетя, у которого на чтение public, а на запись internal smile

либо 
Цитата(vitovt @  3.10.2006,  11:41 Найти цитируемый пост)
private void button1_Click(object sender, EventArgs e)        
{            
if (ApplicationFormList.AdminForm != null)                      
ApplicationFormList.AdminForm.Show();            
 else                    
new TAdminForm().Show();        
}


А это лучше всего обернуть в пропертю:
Код

    public static class FormStorage
    {
        private static Form _form1;

        public static Form Form
        {
            get
            {
                if (_form1 == null) _form1 = new Form1();
                return _form1;
            }
            internal set { _form1 = value; }
        }
    }


PM MAIL WWW ICQ   Вверх
lioness
Дата 12.10.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если объект наследуется  (у меня ArrayList, например), то у меня не получается так лихо напрямую к нему обратиться:

Код

ApplicationFormList.ClassForm10.SignalList ......


Т.е. у объекта формы должен стоять public?  А protected  - не пойдет? 
PM MAIL   Вверх
mr.DUDA
Дата 12.10.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(lioness @  12.10.2006,  18:02 Найти цитируемый пост)
Т.е. у объекта формы должен стоять public?  А protected  - не пойдет? 

protected пойдёт, если обращаемся к полю из наследника


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


Новичок



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

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



Люди а http://xsb3.ifolder.ru/544137 данный проект переделать можете и выложить переделанный чтоб все на практике видели как что к чему.
PM MAIL   Вверх
ivashkanet
Дата 3.12.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(xsb3 @  2.12.2006,  21:50 Найти цитируемый пост)
все на практике видели как что к чему.

чтоб все на практике видели как что к чему.  Чтобы ты его забрал результат, а больше ведь тебе ничего не надо  smile
Примеров, некоторые очень даже хороши, здесь было достаточно  smile 
PM MAIL WWW ICQ   Вверх
VisualProgrammerNET
Дата 6.12.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Достало просто уже писать диздок... Решил хоть чё-нить спрограммить.
xsb3, вот те коды обеих форм.

Форма 1:
Код

public partial class Form1 : Form
    {
        Form2 f2;

        public Form1()
        {
            InitializeComponent();
            f2 = new Form2(this);
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            f2.Show();
        }

        internal void FillUpTheListView(ListViewItem lvi)
        {
            this.listView1.Items.Add(lvi);
        }
    }


Форма 2:
Код

public partial class Form2 : Form
    {
        Form1 f1;
        public Form2(Form1 form)
        {
            InitializeComponent();
            this.f1 = form;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ListViewItem LVI = new ListViewItem(new string[] { textBox1.Text, textBox2.Text, textBox3.Text });
            f1.FillUpTheListView(LVI);
            this.Hide();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }
    }


Да, и обработчик не забудь убрать с listView1_SelectedIndexChanged

Это сообщение отредактировал(а) VisualProgrammerNET - 6.12.2006, 20:24


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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