C # DialogForm открытие при вызове mainForm

1

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

    private void indexForm_Load(object sender, EventArgs e)
    {
        startForm loginForm = new startForm();
        loginForm.ShowDialog();
        indexUsername.Text = klasseGebruikersnaam.gebruikersnaam;          
    }

Поэтому, когда начинается моя indexForm (основная форма), сначала загружается диалоговое окно, которое является моей формой входа.

Теперь моя проблема заключается в том, что всякий раз, когда я пытаюсь подключить mainForm из другой формы с помощью этого кода (например, когда я нажимаю кнопку):

        this.Hide();
        indexForm inf = new indexForm();
        inf.Show();

Диалоговое окно снова появляется. Поэтому я хочу показать свой mainForm, но когда я загружаю свой основной файл, всегда появляется диалоговое окно.

Как это обойти?

Заранее спасибо.

Теги:
winforms
dialog

3 ответа

2
Лучший ответ

Проблема в том, что вы загружаете свой loginForm из основного события загрузки формы. Который всегда срабатывает после вызова конструктора Main Form. Как правило, вы захотите запустить loginForm где-то до загрузки основной формы. Вы можете сделать это в своем Program.cs и сделать его основной точкой входа в программу. Или просто проверьте, зарегистрирован ли пользователь.

Вот пример и того, и другого:

Program.cs

static void Main()
{
    //Auto-generated code that VS writes for you

    using (var loginForm = new LoginForm())
    {
        if (loginForm.ShowDialog() == DialogResult.Yes) //Presumably it would only return Yes if the login was successful.
        {
            Application.Run(new MainForm()); //Or however you call your main form
        }
    }
}

Вы можете просто поместить свойство в основную форму, которая определяет, вошел ли пользователь в систему. Затем вы можете вызвать его в событии " Load.

Событие загрузки

if(!this.UserLoggedIn)
{
    loginForm.ShowDialog();
    //Do something with the dialog result.
}

По-моему, лучше всего использовать подход Program.cs потому что если пользователь не сможет правильно войти в систему, вы можете просто выйти или обработать его по мере необходимости, не загружая основную форму вообще. То, как вы сейчас это делаете, основная форма должна загружаться до отображения формы входа в систему, что может быть проблематичным.

  • 0
    не могу заставить работать подход program.cs. Что вы на самом деле имеете в виду под «loginCredentials» в новой MainForm?
  • 0
    @ user3644837 Не копируйте и не вставляйте напрямую, вам, вероятно, не нужны учетные данные для входа, это то, что я бы сделал, чтобы передать роль пользователей и т. д. в основную форму, если у вас есть разные версии для разных ролей и т. д. Я прокомментировал пример, чтобы, надеюсь, объяснить немного лучше.
Показать ещё 7 комментариев
1

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

Итак, предположим, что вы входите в форму для формы экземпляра типа LoggedinUser

public class LoggedinUser
{
     public string NickName {get;set;}
     public string UserRole {get; set;}
     ...
}

то в классе утилиты (или в вашей индексной форме) вы можете иметь статическую переменную

public static LoggedinUser currentOperator = null;

в вашем index_form вы можете написать

if(GlobaClass.currentOperator == null)
{
    using(startForm loginForm = new startForm())
    {
        if(loginForm.ShowDialog() == DialogResult.OK)
           GlobalClass.currentOperator = loginForm.LoggedUser;
    }
}
  • 0
    Приятно с примерами, это один из немногих случаев, когда глобальные являются хорошей идеей;)
  • 0
    Обычно глобалы опасны, но их не всегда можно избежать (или их удобно избегать). Когда глобальная переменная представляет собой единую сущность, необходимую для жизненного цикла приложения (или когда ее изменения легко отслеживаются (вход / выход из системы), тогда для них есть возможность
0

похоже, вам нужно добавить чек, чтобы узнать, вошел ли пользователь в систему

loginForm.ShowDialog();

что-то вроде

if(!UserLoggedIn())
{
    loginForm.ShowDialog();
}
  • 0
    Так что мне нужно поставить эту проверку в моем событии загрузки mainForm правильно?
  • 0
    да, обратите внимание, что метод UserLoggedIn - это то, что вам нужно собрать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню