Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с возвратом данных из формы в C#  (Прочитано 10371 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MutatoR
Гость
« : 05-12-2009 19:29 » 

Проблема вот в чем:

Код:

      private void button1_Click(object sender, EventArgs e)
        {
          //При нажатии кнопки вызвать новую форму AddServer
            Form AddSe =new AddServer();
            AddSe.Visible = true;
            AddSe.Activate();
          //Если в форме AddServer переменная AllOk равна true
          //то в комбобокс добавить новую строку
            if (WindowsFormsApplication.AddServer.AllOk)
            {
                comboBox1.BeginUpdate();
                comboBox1.Items.Add("текст");
                comboBox1.EndUpdate();
            }
        }

В свою очередь форма AddServer состоит из двух текстбоксов и кнопки, которая описывается так:

Код:
       private void button1_Click(object sender, EventArgs e)
        {
            string sName = textBox1.Text;
            string sRealm = textBox2.Text;
           // AllOk сделан так -         internal static bool AllOk;
            AllOk = false;
            if (!((sName.Length==null)&&(sRealm.Length==null)))
            {
                AllOk = true;
                this.Close();
            }
        }

В идеале все работает так:
 В первой форме жмем на кнопку - появляется форма AddServer, в ней заполняем текстбоксы, нажимаем "Ок" - AddServer закрывается, и первая форма добавляет строку в комбобокс, жмем "Отмена" - и ничего не добавляется.

Но!
 Жмем кнопку на первой форме, заполняем поля, жмем "Ок" - AddServer закрывается и... ничего не происходит. Жмем опять - AddServer открывается, сразу жмем "Отмена", и комбобокс пополняется новой строкой!

Извините за сумбурное описание, но я тут сам не рАзберусь  А черт его знает...

Кстати, я знаю, что где-то здесь сильно напортачил, но не знаю где Жаль
« Последнее редактирование: 07-12-2009 07:49 от Sel » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 07-12-2009 07:24 » 

Нужно модальное окно использовать. Не:
Код: (Text)
AddSe.Visible = true;
AddSe.Activate();
а
Код: (Text)
AddSe.ShowModal();
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 07-12-2009 08:41 » 

Вот эту строчку можешь прокоментировать?

if (WindowsFormsApplication.AddServer.AllOk)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
MutatoR
Гость
« Ответ #3 : 07-12-2009 16:21 » 

Вот эту строчку можешь прокоментировать?

if (WindowsFormsApplication.AddServer.AllOk)

В этом проекте (WindowsFormsApplication) есть форма AddServer, а в ней есть bool AllOk;

Вот если во второй форме (Addserver) эта самая AllOk==true (там идет проверка на то, что поля не пустые), то работаем дальше.

Кстати, проблему я решил:
 Прописал в форме AddServer переменную AllOk как "internal static bool AllOk;"
P.S. перед "и" запятая, вроде, не ставится?
« Последнее редактирование: 07-12-2009 16:27 от Sel » Записан
Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #4 : 07-12-2009 16:28 » 


P.S. перед "и" запятая, вроде, не ставится?


MutatoR, там было сложносочиненное предложение, а это значит, что запятая ставится.
Учебник по русскому языку тоже неплохо бы почитать...
Записан

Слово не воробей. Всё не воробей, кроме воробья.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 08-12-2009 07:43 » 

MutatoR, судя по всему ты нифига не понимаешь, что ты делаешь. Ты программируешь методом тыка - написАл чевойн-то, скопмилилось - и ладно, не скомпилилось - давай менять, пока не получится.

Поэтому проблему ты не решил, а только усугубил, так сказать.

Зачем тебе СТАТИК в форме AddServer, если ты создаёшь объект вот здесь?

Код:
Form AddSe =new AddServer();

Статик нужен, если ты будешь пользоваться ТОЛЬКО статическими методами класса. У тебя же это явно не происходит. В данном случае ты должен:

1. Сделать НЕ переменную, а свойство AllOk, которое является враппером приватной переменной _allOk. (зачем? - почитай любой доступный учебник по ООП)

2. Создавать объект по указателю не на тип Form, а на тип твоего окна:
Код:
AddServer AddSe =new AddServer();

3. И наконец проверять свойство этого объекта:

Код:
if (AddSe.AllOk)


Ты бы сделал это с самого начала, а не извращался со статиком, если бы сначала написал структуру и логику своей программы на бумажке.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
13th
Гость
« Ответ #6 : 24-04-2010 11:11 » 


2. Создавать объект по указателю не на тип Form, а на тип твоего окна:
Код:
AddServer AddSe =new AddServer();


Специально зарегестрировался, спасибо сказать. Час бился в истерике, не понимая, почему не видны методы моей формы.

Спасибо=)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-04-2010 13:36 » 

13th, основы C++...
Через указатель на родительский класс невозможно получить доступ к членам дочернего класса без приведения типа указателя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines