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

я есть две формы в моем проекте (Логин и Главная).

Я пытаюсь объяснить, что при успешном входе в систему я должен показать основную форму и закрыть форму входа.

У меня есть этот метод в форме входа в систему, которая закрывает форму входа в систему при успешном входе в систему. Но Главная форма не показывает.

public void ShowMain()
{
    if(auth()) // a method that returns true when the user exists.
    {             
        var main = new Main();
        main.Show();
        this.Close();
    }
    else
    {
        MessageBox.Show("Invalid login details.");
    }         
}

Я попытался скрыть форму входа, если процесс входа прошел успешно. Но это беспокоит меня, потому что я знаю, что когда моя программа работает, форма входа еще там, она должна быть закрыта, верно?

Какой должен быть правильный подход для этого? Спасибо...

 Abu Muhammad01 мая 2017 г., 09:17
вы можете попробовать, main.ShowDialog (); вместо main.Show () ;. это должно работать нормально. т.к. ShowDialog это немодальная форма.
 yonan223621 янв. 2011 г., 14:35
то же самое, все приложение закрывается.
 Roberto Conte Rosito21 янв. 2011 г., 14:31
попробуйте вызвать this.Close () в конце, а не в качестве первой операции

Ответы на вопрос(14)

попробуй это

 private void cmdLogin_Click(object sender, EventArgs e)
    {
        if (txtUserName.Text == "admin" || txtPassword.Text == "1")
        {

            FrmMDI mdi = new FrmMDI();
            mdi.Show();
            this.Hide();
        }
        else {

            MessageBox.Show("Incorrect Credentials", "Library Management System", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }

и когда вы выходите из приложения вы можете использовать

 Application.Exit();
 Jannik14 нояб. 2013 г., 13:09
Это было бы плохой идеей, если вы действительно хотите закрыть ее, потому что форма все равно останется в памяти ...

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

Program.cs
static class Program
{
    static ApplicationContext MainContext = new ApplicationContext();

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        MainContext.MainForm = new Authenticate();
        Application.Run(MainContext);
    }

    public static void SetMainForm(Form MainForm)
    {
        MainContext.MainForm = MainForm;
    }

    public static void ShowMainForm()
    {
        MainContext.MainForm.Show();
    }
}

Когда процесс входа в систему завершен.

private void BtLogin_Click(object sender, EventArgs e)
    {
        //Login Process Here.

        Program.SetMainForm(new Portal());
        Program.ShowMainForm();

        this.Close();
    }

Я надеюсь, что это поможет вам.

Загрузитеmainform первый и в своемonload событие показать вашloginform с участиемshowdialog() что помешаетmainform от показа, пока вы не получите результат отloginform

РЕДАКТИРОВАТЬ: Как этоавторизоваться формы и если вам не нужны переменные из вашегоmainform (который на практике плохой дизайн), вы должны действительно реализовать это в своих program.cs, как предложили Дэвид и Коди.

 Cody Gray♦21 янв. 2011 г., 14:54
Я не могу представить себе случай, когда одна форма должна требоватьпеременные из другой формы.
 Cody Gray♦21 янв. 2011 г., 15:00
@Bolu: Дело не в том, что «я прав, ты не прав», а в том, что одна форма обращается к переменным другой формы.всегда плохой дизайн на объектно-ориентированном языке. Я думаю, что это важно, чтобы ОП понимали это.
 Bolu21 янв. 2011 г., 15:03
@ Коди, правда. Как OP спросил, как я могу съесть свое яблоко, так как я не могу разрезать яблоко с помощью ручки, мой ответ такой: «использовать нож», тогда как ваш ответ имеет больше смысла: «вам не нужно резать его, просто ешьте Это"....
 Bolu21 янв. 2011 г., 14:56
@ Коди: так, это делает ваш ответ неизбежным. Вы знаете, я иногда чувствую, что вам нужно предоставить что-то на основе исходного кода / идеи ОП, чтобы они лучше поняли, в чем проблема ...
public void ShowMain()
  {
       if(auth()) // a method that returns true when the user exists.
       {        
         this.Hide();
         var main = new Main();
         main.Show();
       }
      else
       {
              MessageBox.Show("Invalid login details.");
        }         
   }
 Wayne Werner30 нояб. 2011 г., 18:05
Хотя, по-видимому, правильно, этот вопрос уже имелнесколько правильные ответы с почти одинаковым кодом. Этот ответ на самом деле не добавляет никакой ценности к вопросу.
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Login();
    } 

    private static bool logOut;

    private static void Login()
    {
        LoginForm login = new LoginForm();
        MainForm main = new MainForm();
        main.FormClosed += new FormClosedEventHandler(main_FormClosed);
        if (login.ShowDialog(main) == DialogResult.OK)
        {
            Application.Run(main);
            if (logOut)
                Login();
        }
        else
            Application.Exit();
    }

    static void main_FormClosed(object sender, FormClosedEventArgs e)
    {
        logOut= (sender as MainForm).logOut;
    }
}

public partial class MainForm : Form
{
    private void btnLogout_ItemClick(object sender, ItemClickEventArgs e)
    {
        //timer1.Stop();
        this.logOut= true;
        this.Close();
    }
}
 Tony Rad05 дек. 2012 г., 00:04
Добро пожаловать в стек переполнения. Пожалуйста, добавьте комментарий к вашему ответу.
 David Cery19 февр. 2017 г., 11:52
Пробовал, работает без нареканий! Спасибо!

ваша проблема в том, что все ваше приложение закрывается, когда ваша форма входа закрывается, верно? Если так, топерейдите в свойства своих проектов и на вкладке приложения измените режим выключения на «Когда последняя форма закрывается» таким образом, вы можете использовать Me.close без закрытия всей программы

 Sacha K30 июл. 2013 г., 13:40
Это доступно только для проектов VB.Net.

как войти успешно, поместить форму входа в FrmMain после InitializeComponent.

 public FrmMain()
 {
      FrmSplash FrmSplash = new FrmSplash();
      FrmSplash.ShowDialog();

      InitializeComponent();
      //Login Section
 {

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

РЕДАКТИРОВАТЬ Пример кода

private void MainForm_Load(object sender, EventArgs e)
{
    this.Hide();

    LogonForm logon = new LogonForm();

    if (logon.ShowDialog() != DialogResult.OK)
    {
        //Handle authentication failures as necessary, for example:
        Application.Exit();
    }
    else
    {
        this.Show();
    }
}

Другое решение было бы показать LogonForm из метода Main в program.cs, что-то вроде этого:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LogonForm logon = new LogonForm();

    Application.Run(logon);

    if (logon.LogonSuccessful)
    {
        Application.Run(new MainForm());
    }
}

В этом примере ваш LogonForm должен будет предоставить свойство LogonSuccessful bool, которое имеет значение true, когда пользователь ввел действительные учетные данные

 Davide Piras21 янв. 2011 г., 14:41
но таким образом, если у вас есть какая-то логика в загрузке основной формы, она все равно будет выполнена ... и вы меняете формы, показывающие рабочий процесс из других форм ... звучит немного грязно и спагетти программируется.
 Cody Gray♦21 янв. 2011 г., 14:49
Зачем вообще загружать основную форму, пока вход не будет успешным?
 yonan223621 янв. 2011 г., 14:37
Можно ли также изначально скрыть основную форму? Затем показать это, когда вход в систему успешен?

Попробуй это:

public void ShowMain()
    {
        if(auth()) // a method that returns true when the user exists.
        { 
            this.Close();
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Main));
            t.Start();
        }
        else
        {
            MessageBox.Show("Invalid login details.");
        }         
    }
   [STAThread]
   public void Main()
   {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Main());

   }

Вы должны вызывать новую форму в другой поточной квартире, если я не ошибаюсь, из-за системы вызовов оконных интерфейсов API и COM.

Один совет: эта система крайне небезопасна, потому что вы можете изменить условие if (в MSIL), и это «детская игра» для передачи вашей безопасности. Вам нужна более сильная система для защиты вашего программного обеспечения, такая как обфускация или удаленный вход в систему или что-то вроде этого.

Надеюсь это поможет.

 Manuel21 янв. 2011 г., 15:06
Я никогда не говорил, что windows работает в многопоточной модели, где я это сказал? Поскольку в окнах есть ограничение для получения формы Windows, API в технологиях COM должен получить единую квартиру потока для выполнения разных программ. Если вы закроете тему входа в систему, все формы будут закрыты. Это активирует основную форму. ShowMain вызывается Application.Run () ... Вы вызываете ShowForm в приложении windowsform при запуске? пожалуйста...
 Davide Piras21 янв. 2011 г., 14:55
из серии, как сделать легкие вещи сложными: DD
 Cody Gray♦21 янв. 2011 г., 14:57
Нет, WinForms не предназначен для работы с многопоточной моделью квартиры. Я не совсем уверен, что вы защищаете здесь, или как этот код будет работать. ГдеShowMain метод когда-нибудь вызывается? Зачем вам вообще нужно создавать новую тему?
Решение Вопроса

по которой ваша основная форма не отображается, заключается в том, что как только вы закрываете форму входа, насос сообщений вашего приложения отключается, что приводит к закрытию всего приложения.Цикл сообщений Windows привязан к форме входа в систему, потому что это та, которую вы установили в качестве формы запуска в свойствах вашего проекта. Загляните в свой файл Program.cs, и вы увидите ответственный код:Application.Run(new LoginForm()), Проверьте документацию для этого метода здесьMSDN, что объясняет это более подробно.

Лучшее решение - переместить код из формы входа в файл «Program.cs». Когда ваша программа запускается впервые, вы создадите и отобразите форму входа в виде модального диалога (который запускается в отдельном цикле сообщений и блокирует выполнение остальной части вашего кода до его закрытия). Когда диалог входа закроется, вы проверите егоDialogResult свойство, чтобы увидеть, если вход был успешным. Если это так, вы можете запустить основную форму, используяApplication.Run (таким образом создавая основной цикл сообщений); в противном случае вы можете выйти из приложения, не показывая никакой формы. Что-то вроде этого:

static void Main()
{
    LoginForm fLogin = new LoginForm();
    if (fLogin.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new MainForm());
    }
    else
    {
        Application.Exit();
    }
}
 r.hamd20 авг. 2015 г., 12:11
У меня есть следующий код в LoginForm, когда я вставляю имя пользователя и пароль, он не переходит в основную форму JardDBEntities contxt = new JardDBEntities (); private void buttonX1_Click (отправитель объекта, EventArgs e) {var myUser = contxt.Users.FirstOrDefault (brs => brs.UserName == textBoxX1.Text.Trim () && brs.UserPass == textBoxX2.Text.Trim ()); if (myUser! = null) {var access = contxt.Users.Where (acc => acc.UserName == textBoxX1.Text) .First (); } else {lb.Visible = true; }}
 r.hamd20 авг. 2015 г., 12:18
Не могли бы вы добавить, что должно быть написано в форме входа в систему также?
 faruk08 окт. 2016 г., 21:35
@ r.hamd просто установите DialogResult = DialogResult.OK после вызова this.Close () в LoginForm
 r.hamd20 авг. 2015 г., 11:52
Могу ли я использовать этот метод с большими проектами? это хорошая практика? @ Коди Грей

что гораздо лучший способ сделать это в файле Program.cs, где у вас обычно есть Application.Run (form1), таким образом, вы получаете более чистый подход, форма входа не должна быть связана с главной формой, вы просто покажите логин, и если он вернет true, вы увидите основную форму, иначе ошибка

пост слишком старый, я хотел бы дать вам хитрость, чтобы сделать это, если вы хотите показать экран-заставку / вход в систему и когда индикатор выполнения на экране-заставке получает определенное значение / или успешный вход в систему и закрытие всплывающей подсказки / входа в систему, а затем снова показать основная форма, frm-main будет формой запуска, а не frm-spalash

в основном

public partial class frmMain : Form
{
    public frmMain()
    { 
        frmSplash frm = new frmSplash();
        frm.Show(); // new splash screen will shows
        this.Opacity=0; // will hide your main form
        InitializeComponent();
    }
 }

в ФРМ-Всплеск

private void timer1_Tick(object sender, EventArgs e)
{
 int cnt = progressBar1.Value;

    switch (cnt)
    {
        case 0:
                //Do sum stuff
            break;
        case 100:

            this.Close(); //close the frm-splash
            frmMain.ActiveForm.Opacity = 100; // show the frm-main

            break;
    }

    progressBar1.Value = progressBar1.Value+1;
}

если вы используете его для формы входа

private void btlogin_Click(object sender, EventArgs e)
{
 bool login = false;

    //try your login here 
    //connect your database or whatever
    //and then when it success update login variable as true

        if(login == true){

            this.Close(); //close the frm-login
            frmMain.ActiveForm.Opacity = 100; // show the frm-main

        }else{
              //inform user about failed login
        }
}

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

Это самое элегантное решение.

private void buttonLogin_Click(object sender, EventArgs e)
{
    MainForm mainForm = new MainForm();
    this.Hide();
    mainForm.ShowDialog();
    this.Close();
}

;-)

Вот код

 private void button1_Click(object sender, EventArgs e)
 {  
        //creating instance of main form
        MainForm mainForm = new MainForm();

        // creating event handler to catch the main form closed event
        // this will fire when mainForm closed
        mainForm.FormClosed += new FormClosedEventHandler(mainForm_FormClosed);
        //showing the main form
        mainForm.Show();
        //hiding the current form
        this.Hide();
  }

  // this is the method block executes when main form is closed
  void mainForm_FormClosed(object sender, FormClosedEventArgs e)
  {
       // here you can do anything

       // we will close the application
       Application.Exit();
  }

Ваш ответ на вопрос