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

Поиск:

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


Новичок



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

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



Цитата

Имеются  2 формы. В них button1,button2  и textBox1,textBox2 соответственно. По клику на кнопку button1 рткрывается форма2. 
Как быть, если нужно чтоба текст из textBox2 второй формы попадал в открытую уже форму1?

В Form2 пишем

Код

public string TextInTextBox
{
    get { return this.textBox2.Text; }
}


Обработчик нажатия на кнопку 2 в Form2

Код

private void button2_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
}



Обработчик нажатия на кнопку 1 в Form1

Код

private void button1_Click(object sender, EventArgs e)
{
Form2 Form1 = new Form2();
if (Form1.ShowDialog() == DialogResult.OK)
 {
textBox1.Text = Form1.TextInTextBox;
 }
}

PM MAIL   Вверх
Sergey_P
Дата 11.9.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Dark_Falcon @  10.9.2007,  09:19 Найти цитируемый пост)
Цитата

Имеются  2 формы. В них button1,button2  и textBox1,textBox2 соответственно. По клику на кнопку 

button1 рткрывается форма2. 
Как быть, если нужно чтоба текст из textBox2 второй формы попадал в открытую уже форму1?

В Form2 пишем


А как сделать, чтобы при нажатии кнопки во второй форме, данные передавались бы в первую, но при 

этом не закрывалась вторая форма?


Я попробовал так:

Цитата(3me1 @  14.8.2006,  12:36 Найти цитируемый пост)
Все предельно просто.
создаем в классе формы указатель на "родительскую" форму

public class ChildForm
{
        private ParentForm parentForm;
        ///ctor
         public child(ParentForm link)
        {
              this.parentForm=link;
        }
 .................
}


но при компиляции в строке "public child(ParentForm link)" выдается ошибка
Class, struct or integface method must have a return type


Дальше я посмотрел пример 

Цитата(ivashkanet @  9.9.2006,  22:49 Найти цитируемый пост)


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

код C#

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



И изменил таким образом

В форме 1 текст такой

Код

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(this);
            f2.Show();         
        }
    }




а в форме 2 такой

Код

    public partial class Form2 : Form
    {
        private Form1 parentForm;
        public Form2(Form1 parentForm)
        {
            this.parentForm = parentForm;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            parentForm.textBox1.Text = this.textBox1.Text; 
        }
    }



Но при компиляции выдается ошибка  
parentForm.textBox1.Text = this.textBox1.Text;
.... .Form1.textBox1.Text is inaccessible due to its protection level

Добавлено через 6 минут и 51 секунду
кстати, а если надо перемещать большой объем данных из потомка в родителя, как сделать, чтобы такая операция не тормозила?
PM MAIL   Вверх
ivashkanet
Дата 11.9.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Sergey_P @  11.9.2007,  16:01 Найти цитируемый пост)
но при компиляции в строке "public child(ParentForm link)" выдается ошибка
Class, struct or integface method must have a return type

Если это конструктор, то он должен называться ChildForm, а если нет, то должен быть тип (void например)
Цитата(Sergey_P @  11.9.2007,  16:01 Найти цитируемый пост)
.... .Form1.textBox1.Text is inaccessible due to its protection level 

Перевод: .... .Form1.textBox1.Text недоступен ввиду его "уровня доступа"
Пояснение: Скорее всего textBox1 имеет модификатор private.
PM MAIL WWW ICQ   Вверх
Sergey_P
Дата 11.9.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



таак, понятно  smile 
исправил на public у кнопки, заработало ...но   
вторая форма появляется вообще пустой   smile 


вот код в первой форме (там в дизайнере добавил текстовое поле и кнопку)

Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(this);
            f2.Show();
        }
    }



на вторую форму тоже добавил кнопку 2, и текстовое поле 2

Код

    public partial class Form2 : Form
    {
        private Form1 parentForm;
        public Form2(Form1 parentForm)
        {
            this.parentForm = parentForm;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            parentForm.textBox1.Text = this.textBox2.Text; 
        }
    }



неделю назад программил на дельфи и в глаза не видел C#, а сейчас срочно надо C#  !!!!! помогите   smile

Добавлено через 4 минуты и 34 секунды
гыыыыы, понял  smile 

я забыл InitializeComponent();
PM MAIL   Вверх
Sergey_P
Дата 12.9.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



к спецам есть еще вопрос - а можно родительской форме передать событие? 
если да, как это правильнее всего сделать?
PM MAIL   Вверх
Deja_Vu
Дата 28.9.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Лично я думаю, что форма, этопржде всего инструмент ввода/ввывода информации, а саму информацию нужно хранить в другом месте.
Поэтому использую родительский класс(свой - DataCenter), который и работает со всеми формами и т.д.

DataCenter.cs
Код

namespace FromDataTransport
{
    public class DataCenter
    {
        public Form f1, f2;
        public string testData;
        
        public void Update()
        {
            (f1 as Form1).updateInfo();
        }

        public DataCenter()
            {
                f1 = new Form1(this);
                f2 = new AboutBox1(this);

                f1.Show();
            }
    }
}


Program.cs
Код

namespace FromDataTransport
{
    static class Program
    {
        static public DataCenter dc;
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            dc = new DataCenter();
            Application.Run(dc.f1);
        }
    }
}


Form1.cs
Код

namespace FromDataTransport
{
    public partial class Form1 : Form
    {
        public DataCenter dc;
        public Form1(DataCenter p)
        {
            InitializeComponent();
            this.dc = p;
        }
        public void updateInfo()
        {
            button1.Text = dc.testData;
        }

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


AboutBox1.cs
Код

namespace FromDataTransport
{
    partial class AboutBox1 : Form
    {
        public DataCenter dc;
        public AboutBox1(DataCenter p)
        {
            InitializeComponent();
            this.dc = p;
        }

         private void okButton_Click(object sender, EventArgs e)
        {
            dc.testData = this.textBoxDescription.Text;
            dc.Update();
            this.Hide();
        }
    }
}


Конечно, я не профи в C#.NET поэтому буду рад обсуждению такого подхода.

Добавлено через 2 минуты и 20 секунд
to Sergey_P
имхо - мой подход может тебе очень помочь, т.к. с помощью него можно получать доступ к чему угодно...
PM Skype   Вверх
ivashkanet
Дата 28.9.2007, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Deja_Vu, нормуль ;-)
Концепция хороша, реализация тоже неплоха. 
Я что-то в этом духе использую сам.
P.S. Только вот это все сложно для тех, кто не знает как "Как обратиться к объекту другой формы"....
PM MAIL WWW ICQ   Вверх
alver
Дата 20.11.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм, очень грустно конечно. Но перечитав топик 4 раза, так и не допонял, какой способ мне нужно использовать. Тут большинство пишут про возвращение значения из формы2 в форму1. А если просто надо передать значение из формы1 в форму2. Т.е. у меня есть форма1 с textBox и кнопка "Далее". При нажатии на кнопку "далее" форма1 закрывается(или скрывается), а значение textBoxa передаётся в форму2, где с ним(со значением) происходят необходимые вычисления.
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 20.11.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(alver @  20.11.2007,  19:23 Найти цитируемый пост)
При нажатии на кнопку "далее" форма1 закрывается(или скрывается), а значение textBoxa передаётся в форму2, где с ним(со значением) происходят необходимые вычисления. 


Код

// Собираем нужные данные на первой форме
from1.Close();

From2 form2 = new Form2();
form2.Initialize(value1, value2, value3, ..., value 45643);

form2.Show();

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


Шустрый
*


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

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



Всё, спасибо разобрался.
А ещё такой вопрос. Т.к. первая форма у меня главная, то при открытии второй, ественно, закрыть первую форму я не могу, приходится её скрывать методом ".Hide()". А при закрытии второй, первая остаётся висеть в памяти. Как же мне при закрытии второй закрыть и первую?

Это сообщение отредактировал(а) alver - 21.11.2007, 01:08
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(alver @  20.11.2007,  20:45 Найти цитируемый пост)
А при закрытии второй, первая остаётся висеть в памяти. Как же мне при закрытии второй закрыть и первую

Из наиболее простых решений я бы предложил следующее:
Код

// Собираем нужные данные на первой форме
from1.Hide();

From2 form2 = new Form2();
form2.Initialize(value1, value2, value3, ..., value45643);

form2.ShowDialog(); // Передаст управление во вторую форму, а когда она закроется вернется сюда

from1.Close();

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


Шустрый
*


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

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



Спасибо. Этот способ я понял. Но уж какой то он больно элементарный. Проти кончено за напористость). Просто хочу ПОНЯТЬ, как именно закрыть первую форму непосредтвенно из второй. Т.е. нужно видеть поля первой формы из второй. Прочитав топик, подозреваю, что нужно передать через конструктор втрой ссылку на первую?? И уже так с ней работать. Но чего то не выходит(

Это сообщение отредактировал(а) alver - 21.11.2007, 11:10
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(alver @  21.11.2007,  11:08 Найти цитируемый пост)
Но уж какой то он больно элементарный

Не думаю, что это недостаток ;-)
Цитата(alver @  21.11.2007,  11:08 Найти цитируемый пост)
Прочитав топик, подозреваю, что нужно передать через конструктор втрой ссылку на первую?? И уже так с ней работать.

Да, но раз у тебя есть метод инициалайз, то лучше через него (Я вообще сторонник того, чтобы конструктор делал как можно меньше --- только создавал нужный объект и все).

А имея ссылку на первую форму можно делать с ней все что угодно, в частности закрыть ее:
Код
refToForm1.Close();


Цитата(alver @  21.11.2007,  11:08 Найти цитируемый пост)
Но чего то не выходит

Надеюсь первая форма не главная форма приложения? В этом случае ее нельзя закрыть не закрыв при этом приложения...
PM MAIL WWW ICQ   Вверх
alver
Дата 21.11.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Щас объясню, собственно, в чём загвоздка. Представь себе любой пошаговый мастер, т.е. есть первая форма, нажимаешь на кнопку "далее", появляется вторая форма, и т.д. У меня таких формы подряд четыре. Первая информационная, вторая для ввода данных, третья для вывода формул, четвёртая для вычислений. Т.е. это и есть пошаговый мастер. Собственно хотелось бы, чтобы как в настоящим мастере можно было по кнопке "назад" откатываться на одну форму назад. Ну и передача значений между формами, в чём собственно ты мне уже помог.
PM MAIL GTalk Jabber   Вверх
1stain
Дата 21.11.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

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



alver, одна форма визарда, на ней несколько панелей, каждая для своего шага. В каждый момент Visible = true только та панель, которая соответствует текущему шагу.  Вся информация аккумулируется в форме визарда.


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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