Подтвердить что ты не робот

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

У меня две формы в моем проекте (Login и Main).

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

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

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.");
    }         
}

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

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

4b9b3361

Ответ 1

Причина, по которой ваша основная форма не отображается, заключается в том, что как только вы закрываете форму входа, ваш насос сообщений приложения отключается, что приводит к завершению всего приложения. Цикл сообщений 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();
    }
}

Ответ 2

Я бы сделал это наоборот.

В событии 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, когда пользователь ввел действительные учетные данные

Ответ 3

Это просто.

Вот код.

 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();
  }

Ответ 4

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

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

; -)

Ответ 5

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

Ответ 6

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();
    }
}

Ответ 7

Это мое решение. Создайте ApplicationContext для установки основной формы приложения и изменения основной формы, когда вы хотите открыть новую форму и закрыть текущую форму.

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();
    }

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

Ответ 8

вы должны сделать это наоборот:

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

ИЗМЕНИТЬ: Поскольку это форма входа в систему, и если вам не нужны какие-либо переменные из вашего mainform (что плохо работает на практике), вы должны реально реализовать его в своей программе .cs, как предложил Давид и Коди.

Ответ 9

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

Ответ 10

Попробуйте следующее:

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-интерфейсов Windows и COM-интерфейсов.

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

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

Ответ 11

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.");
        }         
   }

Ответ 12

лучший способ для входа в систему и закрытия формы входа перед тем, как логин успешно разместит регистрационную форму в FrmMain после InitializeComponent.

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

      InitializeComponent();
      //Login Section
 {

Ответ 13

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

в frm-main

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();
    }
 }

в frm-Splash

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
        }
}

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

Ответ 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();