2010-01-05 3 views
0

Я разработчик ASP.NET, которому была назначена небольшая задача приложения Winforms. Я делаю следующее:Winforms - изменение содержимого формы из одного контекста в другой

  • У меня есть форма с полями для входа и кнопку
  • После успешного входа в систему, я хочу, чтобы обеспечить основную функцию приложения.
  • На данный момент я использую две формы: одну для входа (form1) и одну для основной функции (form2) - делая форму2 видимой и form1 невидимой, когда я переключаюсь между ними.

Я уверен, что я должен делать все в одной форме. Каков нормальный/лучший подход для этого?

Thanks, Richard.

+0

Нет Логин не требуется для WF приложений, Windows уже сделал это. –

+0

Вход требуется, так как я не использую проверку подлинности Windows. – Peanut

ответ

3

Я думаю, что наиболее распространенный подход в мире Windows использует 2 диалога. Например, вход в Skype, Steam, удаленный рабочий стол, SQL-сервер (с использованием SQL Management Studio) и т. Д.

Пользователи Windows также привыкли к обычному поведению диалога входа (здесь я имею в виду, что нажатие кнопки «Отмена» закрывает приложение), и нет другого нарушения, например, главного меню приложения или других элементов управления.

Я предлагаю показать форму входа в событие FormLoad основной формы. Используйте метод ShowDialog и проверьте возвращаемое значение, чтобы определить, была ли форма входа закрыта с успехом.

Для этой работы вам необходимо

  • в обработчике нажмите кнопку «ОК» в набор LoginForm.DialogResult свойство DialogResult.OK (или установить DialogResult свойство непосредственно на кнопку «ОК» с помощью инспектора объектов)

  • с помощью объекта инспектора установить DialogResult для вашей кнопки Отмена, чтобы DialogResult.Cancel

  • с помощью объекта инспектора установить AcceptButton и CancelButton свойства вашего LoginForm к соответствующие кнопки

Код в MainForm:

private void MainForm_Load(object sender, EventArgs e) 
    {   
     LoginForm login = new LoginForm(); 
     login.ShowDialog(this); 

     if (login.DialogResult != DialogResult.OK) 
     { 
      Close(); 
     } 
     else 
     { 
      // Init your application ... 
     } 
    } 


Код в LoginForm:

private void btnOk_Click(object sender, EventArgs e) 
    {   
     if (DoSomeLoginLogic()) 
      DialogResult = DialogResult.OK; // setting this will close the form 
    } 
+0

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

+0

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

1

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

Вызовите его снова, когда пользователь выходит из системы.

1

Единственная форма - это путь, по достижении успеха программа может продолжить следующую форму.

Создайте единую форму, раскрыв поля имени пользователя и пароля двумя кнопками «Принять»/«Отменить».

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

public class LoginModel { 

    private LoginForm view; 
    public LoginModel() { 
     view = new LoginForm(this); 
    } 

    public void Show() { 
     view.Show(); 
    } 

    public bool LoginAttempt(string user, string pass) { 
     // Process login attempt (call LDAP backend etc...). 
    } 

} 

В вашем LoginForm, вам нужно позвонить LoginAttempt(string, string) из OnClick события кнопки входа в систему, это может быть затем введен в фоновый поток, если вы хотите. после успешной попытки входа в систему вы можете вызвать метод Close.

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

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

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