Jak mogę zamknąć formularz logowania i pokazać formularz główny bez zamykania aplikacji?

W moim projekcie mam dwie formy (Login i Main).

To, co próbuję accoomplish jest, jeśli logowanie się powiodło, muszę pokazać główny formularz i zamknąć formularz logowania.

Mam taką metodę w formularzu logowania, która zamyka formularz logowania po pomyślnym zalogowaniu. Ale główna forma się nie pokazuje.

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

Próbowałem ukryć formularz logowania, jeśli proces logowania się powiódł. Ale przeszkadza mi to, bo wiem, gdy mój program jest uruchomiony formularz logowania jest nadal tam też, powinno być zamknięte, prawda?

Jakie powinno być właściwe podejście do tego? Dzięki...

Author: default locale, 2011-01-21

14 answers

Powodem, dla którego główny formularz nie jest wyświetlany, jest to, że po zamknięciu formularza logowania pompa wiadomości aplikacji jest wyłączona, co powoduje zamknięcie całej aplikacji. Pętla Windows message loop jest powiązana z formularzem logowania, ponieważ jest to ta, którą ustawiłeś jako formularz startowy we właściwościach projektu. Zajrzyj do swojego programu.plik cs", a zobaczysz odpowiedzialny bit kodu: Application.Run(new LoginForm()). Sprawdź dokumentację tej metody tutaj na MSDN , która wyjaśnia to w więcej szczegółów.

Najlepszym rozwiązaniem jest przeniesienie kodu z formularza logowania do "programu.plik cs. Po pierwszym uruchomieniu programu utworzysz i pokażesz formularz logowania jako okno modalne(które działa na oddzielnej pętli wiadomości i blokuje wykonywanie reszty kodu, dopóki nie zostanie on zamknięty). Po zamknięciu okna dialogowego logowania sprawdź jego właściwość DialogResult, aby sprawdzić, czy logowanie się powiodło się. Jeśli tak, możesz uruchomić główny formularz za pomocą Application.Run (tworząc w ten sposób główną pętlę wiadomości); w przeciwnym razie możesz zamknąć aplikację bez wyświetlania żadnego formularza. Coś takiego:

static void Main()
{
    LoginForm fLogin = new LoginForm();
    if (fLogin.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new MainForm());
    }
    else
    {
        Application.Exit();
    }
}
 95
Author: Cody Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:46:30

Zrobiłbym to na odwrót.

W zdarzeniu OnLoad dla głównego formularza Pokaż formularz logowania jako okno dialogowe. Jeśli wynik okna dialogowego jest OK, pozwól Main kontynuować ładowanie, jeśli wynikiem jest niepowodzenie uwierzytelniania, przerwij ładowanie i Pokaż okno wiadomości.

EDIT Code sample(S)

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

Innym rozwiązaniem byłoby pokazanie logowania z głównej metody w programie.cs, coś takiego:

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

    LogonForm logon = new LogonForm();

    Application.Run(logon);

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

W tym przykładzie Twój LogonForm będzie musiał ujawnić właściwość LogonSuccessful bool, która jest ustawiona na true, gdy użytkownik wprowadził poprawne poświadczenia

 7
Author: MrEyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:51:39

To proste.

Oto kod.

 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();
  }
 5
Author: Shanita Weerasinghe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 10:31:06

To najbardziej eleganckie rozwiązanie.

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

;-)

 3
Author: Bhaggya Solangaarachchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-10 06:13:42

Oto proste rozwiązanie, twój problem polega na tym, że cała aplikacja zamyka się po zamknięciu formularza logowania? Jeśli tak, to Przejdź do właściwości projektów i na karcie aplikacja zmień tryb zamykania na"kiedy ostatni Formularz się zamknie" w ten sposób możesz użyć mnie.Zamknij bez zamykania całego programu

 2
Author: Miguel Gamboa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-30 16:54:54
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();
    }
}
 2
Author: Mehmet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 22:29:26

To jest moje rozwiązanie. Utwórz Applicationkontekst, aby ustawić mainform aplikacji i zmienić mainform, gdy chcesz otworzyć nowy formularz i zamknąć bieżący formularz.

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

Po zakończeniu procesu logowania.

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

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

        this.Close();
    }
Mam nadzieję, że to ci pomoże.
 2
Author: MoMo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 04:28:58

Myślę, że znacznie lepszą metodą jest zrobienie tego w programie.plik cs, w którym zwykle masz aplikację.Uruchom (form1), w ten sposób otrzymujesz czystsze podejście, formularz logowania nie musi być połączony z formularzem głównym, po prostu pokazujesz login i jeśli zwróci true wyświetlasz formularz główny, w przeciwnym razie błąd.

 0
Author: Davide Piras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:37:40

Spróbuj tego:

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

   }

Musisz wywołać nowy formularz w różnych wątkach, jeśli się nie mylę, ze względu na system wywołania interfejsów API i COM windows.

Jedna rada: ten system jest wysoce niepewny, ponieważ można zmienić warunek if (W MSIL) i jest to "gra dla dzieci", aby przekazać swoje bezpieczeństwo. Potrzebujesz silniejszego systemu, aby zabezpieczyć swoje oprogramowanie, takie jak zaciemnianie lub zdalne logowanie lub coś w tym stylu.

Mam nadzieję, że to pomoże.
 0
Author: Manuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:52:05

Powinieneś zrobić to odwrotnie:

Załaduj mainform jako pierwsze i w zdarzeniu onload pokaż swoje loginform za pomocą showdialog(), co uniemożliwi mainform wyświetlanie, dopóki nie otrzymasz wyniku z loginform {8]}

Edytuj : Ponieważ jest to Formularz login i jeśli nie potrzebujesz żadnych zmiennych z twojego mainform (co jest złym projektem w praktyce ), naprawdę powinieneś go zaimplementować w swoim programie.cs jak zasugerowali Davide i Cody.

 0
Author: Bolu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 14:07:34
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.");
        }         
   }
 0
Author: santan pereira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 16:07:47

Najlepszy sposób na wyświetlenie loginu i zamknięcie formularza logowania przed zalogowaniem pomyślnie umieść formularz logowania w FrmMain po InitializeComponent.

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

      InitializeComponent();
      //Login Section
 {
 0
Author: Ehsan Farahani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 00:49:43

Evan post jest za stary Lubię dać ci sztuczkę, aby to zrobić, jeśli chcesz pokazać ekran splash / login i kiedy pasek postępu ekranu splash uzyskać pewną wartość / lub pomyślne logowanie się i zamknąć splash / login następnie ponownie pokazać formularz główny, FRM-main będzie formularz startowy nie FRM-spalash

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

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

Jeśli używasz go do formularza logowania

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

Zauważ, że używam timera i paska postępu do manipuluj działaniami, których nie potrzebujesz, tylko ze względu na kompletną odpowiedź, mam nadzieję, że to pomoże]}

 0
Author: Aylian Craspa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 07:14:18

Spróbuj tego

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

I po wyjściu z aplikacji możesz użyć

 Application.Exit();
 -1
Author: Amila Thennakoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 04:22:58