2012-04-12 2 views
0

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

public void success() 
{ 
    mainForm index = new mainForm(); 
    index.Show(); 
    this.Close(); 
} 

Я думал, что это откроет mainForm и закрыть форму входа в систему, однако, когда я запускаю это, она закрывает все приложения. Почему это? Я довольно новичок в C# и OOP в целом, поэтому любые советы приветствуются!

Я пытался сделать что-то вроде этого: Closing a form and then call another one

Но я все равно получил тот же результат.

Спасибо :)

ответ

2

ли это нравится:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
    using (Login login = new Login()) 
    { 
    login.StartPosition = FormStartPosition.CenterScreen; 
    if (login.ShowDialog() == DialogResult.OK) 
    {  
     Application.Run(new Form1(login.strUserName)); //passing the userName to the constructor of form1 (see bellow) 
    } 
    } 
    } 
} 

//form1: 
public partial class Form1 : Form 
{ 
    string userName; 
    public Form1(string _strUser) 
    { 
    InitializeComponent(); 
    userName = _userName; //a local variable of a form1 class has hold user`s name (userName - which u can call it from within the form1 class! 
    } 
} 
+0

Код показывает, как передать переменную (имени пользователя) из формы входа в основную форму. –

+0

Спасибо за код, я работаю над его внедрением! Один вопрос, должен ли 'userName = _userName' фактически быть' userName = _strUser'? В противном случае, откуда я должен получать '_userName'? –

+0

Это может быть любая переменная. Это переменная, которую я придумал. –

1

Как пояснялось в другом вопросе, вы не можете закрыть главное окно вашего приложения (то есть окно переданного Application.Run()).

Чтобы решить эту проблему, отправьте экземпляр своего mainForm на номер Application.Run() и сообщите об этом при открытии диалогового окна входа в систему mainForm.

1

Возможно, вы захотите перенести свою регистрационную форму в Program.cs вместо того, чтобы устанавливать ее как форму запуска. Подробнее см. Здесь: How can I close a login form and show the main form without my application closing?

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

1

Ответы здесь объясняют некоторые решения, но для выяснения проблемы см. Application.Run Method (Form) на MSDN. В нем указано:

Этот метод добавляет обработчик события к параметру mainForm для события Closed. Обработчик событий вызывает ExitThread для очистки приложения.

Итак, поскольку вы начинаете с окна входа, как только он закрывается, он запускает ExitThread и закрывает приложение. Как я уже сказал, другие ответы здесь иллюстрируют несколько способов избежать этой проблемы, например, создать окно входа непосредственно в Main() или запустить основную форму и управлять ею с помощью окна ввода.

0

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

Application.Run(new Form1(login.strUserName)); 

логин - это ссылка на форму входа. Поэтому я только «перебрал» strUserName varaible из формы входа в программу (где все это началось) и Form1, поэтому я могу показать ее там. Почему я должен передать его и почему я не могу просто получить доступ к нему из Form1? Это связано с тем, что, когда код приходит в Form1, форма входа уже размещена, и все участники из Login установлены в null (не доступны). Вы можете видеть, когда я инициализировал класс входа, я сделал это при использовании блока, поэтому, когда код его покидает, класс тоже утилизирует.

КСТАТИ Войти форму выглядит следующим образом:

class Login 
{ 
    public string strUserName { get; private set; } 
} 

Надеется, что это помогает понять. bye

Смежные вопросы