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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по формам 
:(
    Опции темы
motorway
Дата 11.8.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть две формы Form1 и Form2. При нажатии на кнопку в первой должна открываться вторая, а при написании в ней сообщения в текстбоксе оно должно посылаться в первую форму в label.

Вопрос: почему из второй формы не видны сразу переменные первой, и почему нельзя просто написать в обработчике Button1_click типа Form1.label1.text=textBox1.text; ?

Что для этого нужно сделать? Обязательно ли передавать данные во вторую форму с именем первой в конструкторе вот так?
 Form2 frm = new Form2(this);
           frm.Show(); 

Вот код второй формы:
  
Код

Form1 main;
        public Form2(Form1 mainform) //конструктор
        {
        
            InitializeComponent();
            main = mainform;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            main.label1.Text = "A";
        }


Т.е., если хочешь что-то изменить из одной формы в другой по нажатию кнопки, обязательно ей передавать в конструктор первую форму в качестве параметра (new Form2(this);)? Или можно по-другому?


PM MAIL   Вверх
QryStaL
Дата 11.8.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Вопрос уже много раз подымался. Если вкратце - через события. Подробнее - можно в поиске найти.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
motorway
Дата 11.8.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я не очень понимаю, по обработчику какого события в первой форме присваивать label1.Text=...? ввели текст во вторую форму, нажали ОК, и как теперь это обработать в первой форме?
PM MAIL   Вверх
Rififi
Дата 11.8.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



примерно так (код не проверялся)
Код

using (Form2 frm = new Form2())
{
    frm.button1.Click += delegate() { label1.Text = "xxx"; }
    frm.ShowModal();
}

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


Опытный
**


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

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



можно и без этого. Делегаты я еще не выучил. Просто объявляем в Form2 переменную public string a. И потом обращаемся из 1 формы к frm.a
PM MAIL   Вверх
v_enom
Дата 8.11.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ничего не понятно....какие еще делегаты. Блин, неужели нет простого способа получить доступ к свойствам объектов??? напишите пожалуйста простой нормальный пример для зеленых новичков без всяких непонятных += delegate() и т.д.
Как в билдере чтобы Form1.TextBox = "xxxx" 

я пробовал создать 
Код

using (MainForm mainForm = new MainForm() )
{
  // и тут присваивать.... 
}


но не срабатывает. нету эффекта и правильно, потому что  mainForm  эту уже совсем другая форма
PM MAIL   Вверх
Ch0bits
Дата 9.11.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



На самом деле это в билдере и дельфях было не нормально, а через делегаты самое то! Мы не ищем лёгких путей!  smile 
PM WWW   Вверх
EgoBrain
Дата 9.11.2008, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если хочешь получать доступ к полям одной формы из другой делай поля public static и к контролу тоже можно получить доступ!
PM MAIL ICQ Skype   Вверх
EgoBrain
Дата 9.11.2008, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В зависимости от версии студии делай так (у меня 2008. В 2005 и 2008 модульность проекта по другому строится в отличии от 2003):
 Первая форма:
Код

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public static Form1 form1;

        public Form1()
        {
            InitializeComponent();
            form1 = this;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Form2 form2 = new Form2();
            form2.Show();
        }
    }
}


Вторая форма:
Код

namespace WindowsFormsApplication3
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.form1.label1.Text = "Text was changed by Form2!";
        }
    }
}


А вот модуль объектов Form1 (для студий начиная от 2005) Form1.designer.cs:
Код

namespace WindowsFormsApplication3
{
    partial class Form1
    {
       ...
      public System.Windows.Forms.Label label1;
    }
}


Насколько это правильно и этично с точки зрения ООП х3, но если есть такая возможность, значит создатели это предусмотрели и так можно. Поле первой формы form1 необходимо делать static, чтобы оно однозначно определялось в единственном экземпляре.
PM MAIL ICQ Skype   Вверх
Dims
Дата 11.11.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Я думаю, разница с дельфями заключается просто в заорганизованности. Думаю, что можно залезть во вторую часть класса, которую пишет сама студия, и поменять там у нужных элементов private на public или internal. А в дельфях они просто по умолчанию public.

Но только ведь их неспроста сделали private, значит есть какой-то замысел, который ты нарушишь. Потом что-нибудь не так будет работать и нифига не поймёшь, отчего.
PM MAIL   Вверх
diadiavova
Дата 12.11.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(EgoBrain @  9.11.2008,  04:57 Найти цитируемый пост)
Насколько это правильно и этично с точки зрения ООП х3, но если есть такая возможность, значит создатели это предусмотрели и так можно. 

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

Цитата(Dims @  11.11.2008,  23:03 Найти цитируемый пост)
Думаю, что можно залезть во вторую часть класса, которую пишет сама студия, и поменять там у нужных элементов private на public или internal. А в дельфях они просто по умолчанию public.

public - поля по-умолчанию... считается, что это не есть хорошо.
Никуда не надо лезть. Просто в свойствах элемента(в дизайнере) есть такое как Modifers ему надо присвоить нужное значение и всё.

Другой вопрос, что проблему доступа к вызвавшей форме это не решит. В большинстве случаев в таких ситуациях вторая форма вызывается как диалоговое окно, а после её закрытия с неё считывается информация и заносится в нужные поля. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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