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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно отобразить немодальный диалог? 
:(
    Опции темы
ВладимирБерезин
Дата 21.10.2015, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
есть вот такой код:
Код

        private void найтиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (rtbNotepad.Text != "") {
                SearchDialog sed = new SearchDialog();
                sed.Show();
            }
        }



Здесь, при выборе на главной форме пункта меню "Найти", выводится немодальная форма. Проблема вот в чём: при каждом клике по этому пункту меню создаётся новый экземпляр диалогового окна. Вопрос: как этого избежать?
Не хотелось бы переменную sed выносить за пределы метода найтиToolStripMenuItem_Click и делать её полем класса. Некрасиво это как-то...
PM MAIL   Вверх
Экскалупатор
Дата 21.10.2015, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



почему некрасиво? если у вас логика требует одной формы то в любом случае вам нужно хранить ее в одной переменной. Можно синглтон замутить. 
Мне кажется вам не обязательно иметь именно одну форму. скорее всего вопрос в данных в этой форме. Можно их сохранить и заполнять форму сохраненными данными. тогда визуально это будет выглядеть как одна форма.

P.S.
а вот такие названия "найтиToolStripMenuItem_Click" это действительно "некрасиво".
PM MAIL ICQ   Вверх
ВладимирБерезин
Дата 22.10.2015, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Экскалупатор @ 21.10.2015,  20:22)
Мне кажется вам не обязательно иметь именно одну форму. скорее всего вопрос в данных в этой форме. Можно их сохранить и заполнять форму сохраненными данными. тогда визуально это будет выглядеть как одна форма.


Вот тут я не очень понял. У меня диалоговое окно размножается.

PM MAIL   Вверх
Экскалупатор
Дата 22.10.2015, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



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


Новичок



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

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



Вы меня убедили. В конце концов я сделал вот так:

Код

namespace MyNotePad
{
    public partial class frmNotepad : Form
    { 
       ...
       SearchDialog sed = null;
       ...
        private void найтиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (rtbNotepad.Text != "" && sed == null) {
                sed = new SearchDialog();
                sed.Show();
                sed = null;
            }
        }
        ...
    }
}


Это сообщение отредактировал(а) ВладимирБерезин - 22.10.2015, 11:12
PM MAIL   Вверх
chupachups
Дата 22.10.2015, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И что? работает?
Копни в другую сторону, смотри ниже, только я не уверен, что в качестве sender идет объект типа ToolStripMenuItem, так как не использую этот глючный контрол.
Код

namespace MyNotePad
{
    public partial class frmNotepad : Form
    {
       ...
        private void найтиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var menuItem = (sender as ToolStripMenuItem);
            if (rtbNotepad.Text != "" && menuItem.Tag == null) 
            {
                var form = new SearchDialog();
                menuItem.Tag = form;
                form.FormClosed += delegate
                {
                    menuItem.Tag = null;
                );
                form.Show();
            }
        }
        ...
    }
}


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
ВладимирБерезин
Дата 22.10.2015, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(chupachups @ 22.10.2015,  11:25)
И что? работает?

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


Новичок



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

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



А как оно работает в случае, если несколько раз выбрать пункт меню "Нажать" ?
Получается, код будет продолжать создавать новые экземпляры SearchDialog формы.
Из условий задачи я понял, что это нужно избегать.

Думаю, если класс SearchDialog реализовать через шаблон Singleton, то new SearchDialog() всегда будет возвращать указатель на одну и ту же форму и метод form.Show() должен будет работать с одним и тем же окном. Правда, в этом случае есть смысл дополнительно вызвать form.Activate() для перехода на форму.

Хороших выходных!


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 24.10.2015, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



@Rokforus, и как же может выглядеть шаблон Singleton для использования через конструктор, а не через статический метод?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Rokforus
Дата 26.10.2015, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вы правы - скорее всего академический Singleton тут сложно применить.

Тем не менее я могу предложить свой рабочий вариант, который делает именно так, как я описал выше:

Код

namespace MyNotePad
{
    public partial class frmNotepad : Form
    {

        SearchDialog sed = null;

        private SearchDialog Sed
        {
            get {
                if (sed == null)
                {
                    sed = new SearchDialog();
                    sed.FormClosed += delegate
                    {
                        sed = null;
                    };
                }
                return sed;
            }
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if (rtbNotepad.Text != "")
            {
                Sed.Show();
                Sed.Activate();
            }
        }

        ...

    }
}


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 26.10.2015, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сразу могу предположить что как минимум в 75% случаев понадобится писать так:
Код

Sed.Show();

if (Sed.WindowState == FormWindowState.Minimized)
   Microsoft.WinApi.User32.ShowWindow(Sed.Handle, Microsoft.WinApi.Constants.SW_RESTORE);

Sed.BringToFront();
Sed.Activate();



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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