Winforms - изменение содержимого формы из одного контекста в другой - PullRequest
0 голосов
/ 06 января 2010

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

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

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

Спасибо, Ричард.

Ответы [ 3 ]

3 голосов
/ 06 января 2010

Я думаю, что наиболее распространенный подход в мире Windows - это использование двух диалогов. Например, войти в 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
    }
1 голос
/ 06 января 2010

Одна форма - это путь, после успешного завершения которого программа может перейти к следующей форме.

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

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

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 ), если вы посмотрите на проект поздней ночи.

1 голос
/ 06 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...