92 / 92 / 6
Регистрация: 04.05.2011
Сообщений: 171
1

Одним нажатием открыть одну форму и закрыть другую

30.01.2012, 21:40. Показов 14676. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
Бью себя ушами по щекам, но извините, не нашёл этой темы на форуме.

В общем, я жутко туплю, но не могу понять, как сделать правильно. Суть:
есть форма, на ней есть кнопка. При нажатии на кнопку, хочу чтобы форма, на которой кнопка находится, закрылась (именно закрылась, а не свернулась), а вторая, заранее приготовленная форма, появилась (типа, вход по логину-паролю(первое окно) в систему(второе окно)).

Пробовал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// В этом случае открывается вторая форма, но почти мгновенно 
//обе закрываются и приложение заканчивает работу.
private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
            this.Close();
        }
 
// Такая конструкция тоже не помогла. 
// Вторая форма-то открывается, да вот первая не закрывается.
private void button5_Click(object sender, EventArgs e)
        {
            Form1 f1 = new Form1();
            Form2 f2 = new Form2();
            f1.Close();
            f2.Show();
        }
 
// Вот такая штука открывает вторую форму на долю секунды
// и тут же её закрывает. Причём, с первой не происходит никаких изменений.
private void button5_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
            Form1.ActiveForm.Close();
        }
 
// Вот эта штука конечно же работает. Вторая форма появляется, а первая уходит с глаз.
// Но во-первых, мне нужно чтобы первая именно закрывалась!
// А во-вторых, если я меняю Hide() на Close(), то на долю секунды открывается вторая форма и 
// мгновенно исчезают обе.
private void button5_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            Form1.ActiveForm.Hide();
            f2.Show();
        }
С нетерпением жду помощи.
Заранее спасибо.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2012, 21:40
Ответы с готовыми решениями:

Закрыть одну форму и открыть другую
Когда нажимаешь на кнопку одна форма закрывается другая открывается... Додскажите... Добавлено...

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

Как закрыть одну форму, и развернуть другую
Ребята, не пойму почему после выбора radioButton, я хочу закрыть окно и открыть форму с окнами, но...

Не могу закрыть форму и открыть другую
Точнее я первую форму закрываю а вот другая форма не открываеться. как я ето делаю: ...

11
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
30.01.2012, 21:52 2
emppu2007, Никак. Вы закрываете главную форму приложения, которой у вас является форма авторизации. Я делал иначе, Запускал основную рабочую форму и сразу её прятал, а показывал вторую форму - форму авторизации с вводом логина и пароля, если логин успешный - показывал основную, если пользователь закрывает форму авторизации не авторизовавшись - закрывал все приложение целиком.
0
92 / 92 / 6
Регистрация: 04.05.2011
Сообщений: 171
30.01.2012, 21:59  [ТС] 3
Хм. Хитро.
Но немного не пойму как это сделать.
В Program.cs писать что-то типа этого:

C#
1
2
Application.Run(new Form2());
Form2.ActiveForm.Hide();
?
А потом?
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
30.01.2012, 22:03 4
emppu2007, ну, я не мудрил с Program.cs, а делал все в MainWindow_Load, как только форма загрузилась, вызываю
C#
1
this.Hide()
, затем
C#
1
2
LoginForm lf = new LoginForm();
lf.ShowDialog(this);
Ну а дальше уже проверки на то, была ли авторизация, и, если была, основная форма показывается, если нет - приложение закрывается.
1
10 / 10 / 1
Регистрация: 28.01.2012
Сообщений: 40
01.02.2012, 17:48 5
Аналогично. Вызываем в мейне 2-ое окно(в моем случае MainForm). А дальше делаем вот такой финт ушами:
C#
1
2
3
4
5
6
7
8
9
10
11
  private void MainForm_Load(object sender, EventArgs e)
    {
      //  определяется исполнитель
      AuthenticationForm af = new AuthenticationForm();
      if (DialogResult.OK != af.ShowDialog(this))
      {
        this.Close();
        return;
      }
...
}
0
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
01.02.2012, 23:02 6
Цитата Сообщение от emppu2007 Посмотреть сообщение
В общем, я жутко туплю, но не могу понять, как сделать правильно.
Запускать вторую форму в новом треде (thread - поток). Первую форму закрыть через метод Close().
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,793
01.02.2012, 23:06 7
Ой, не уверен... Зачем поток-то новый?
PS Жду конструктивной критики...
0
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
01.02.2012, 23:27 8
Цитата Сообщение от emppu2007 Посмотреть сообщение
В общем, я жутко туплю, но не могу понять, как сделать правильно. Суть:
есть форма, на ней есть кнопка. При нажатии на кнопку, хочу чтобы форма, на которой кнопка находится, закрылась (именно закрылась, а не свернулась), а вторая, заранее приготовленная форма, появилась (типа, вход по логину-паролю(первое окно) в систему(второе окно)).
Вопрос состоял именно в этом. Предложенное выше решение решает эту проблему. Хотя лучше работать с одним потоком. Однако если работа идёт с БД, в которой миллионы записей, то логику построения приложения лучше кардинально пересмотреть (смотреть в сторону оптимизации запросов, утечки памяти и прочее - чтобы при минимальных характеристиках железа получить макс. производительность).
0
pincet
01.02.2012, 23:30
  #9

Не по теме:


И хдеж ты узрел работу с БД тута?

0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
02.02.2012, 01:28 10
Может так?
C#
1
2
3
4
    public enum AutorizationResult
    {
        Authorized, AccessDenied, UnauthorizedUser
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public partial class AuthorizationDialog : Form
    {
        public AuthorizationDialog()
        {
            InitializeComponent();
        }
 
        public AutorizationResult GetAccess()
        {
            //Тут проверяем введённые данные, если всё гуд, то возвращаем результат,
            //что авторизован юзер или не авторизован и т.д.
            return AutorizationResult.AccessDenied;
        }
 
        private void okButton_Click(object sender, EventArgs e)
        {
            DialogResult = System.Windows.Forms.DialogResult.OK;
        }
 
        private void cancelButton_Click(object sender, EventArgs e)
        {
            DialogResult = System.Windows.Forms.DialogResult.Cancel;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
 
        //Можно этот метод вообще в Program.cs запихать, смотря как прога организована
        //хотя наверное проще подписаться на событие выхода из приложения
        private void Exit() 
        {
            //Выполняем какие-то важные действия
            Application.Exit();
        }
 
        private void MainForm_Load(object sender, EventArgs e)
        {
            AuthorizationDialog login = new AuthorizationDialog();
            if (login.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                AutorizationResult result = login.GetAccess();
                switch (result)
                {
                    case AutorizationResult.Authorized: MessageBox.Show(this, "Авторизован");
                        break;
                    case AutorizationResult.AccessDenied:
                        MessageBox.Show(this, "Доступ запрещён");
                        Exit();
                        break;
                    case AutorizationResult.UnauthorizedUser:
                        MessageBox.Show(this, "Не авторизованный пользователь");
                        //что-то делаем, например ограничиваем права, если есть возможность заходить неавторизовано
                        break;
                    default: throw new NotImplementedException();
                }
            }
            else
                Exit();
        }
    }
1
92 / 92 / 6
Регистрация: 04.05.2011
Сообщений: 171
02.02.2012, 07:23  [ТС] 11
Сделал по-своему.
В форме авторизации написал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static public string status;
 
public void CClose()
{
    if(status == "run")
    {
        Close();
    }
}
 
private void login_button_ok(...)
{
    ...
    using(...)
    {
        status = "run";
        CClose();
        ...
    }
}
В Program.cs написал:
C#
1
2
3
4
5
6
...
Application.Run(new Form_login());
if(Form_login.status == "run")
{
    Application.Run(new Form_main());
}
Результаты работы данного кода меня вполне устраивают. Всем спасибо. Тему можно закрывать.
2
29 / 29 / 8
Регистрация: 16.10.2012
Сообщений: 170
14.12.2012, 23:34 12
а можно код по подробней описать ?
0
14.12.2012, 23:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2012, 23:34
Помогаю со студенческими работами здесь

Как закрыть форму по таймеру и открыть другую?
Как сделать, так чтобы первая форма (Форма с логотипом) после десяти секунд, закрывалась. И...

После ввода пароля открыть одну форму и закрыть другую
Всем добрый вечер народ помогите плиз) Надо чтобы после ввода пароля открывалась первая форма и...

Закрыть форму/открыть другую форму при нажатии клавиши
Как сделать так что бы форма закрывалась или открывала другую форму нажатием любой клавиши. Спасибо...

Закрыть форму и открыть другую
никак не могу нормально запрограмировать кнопки перехода между формами.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru