У меня проблема с моей диалоговой формой. Это код, который открывает мою диалоговую форму (это форма входа), когда мой основной файл начинает запускаться.
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, но когда я загружаю свой основной файл, всегда появляется диалоговое окно.
Как это обойти?
Заранее спасибо.
Проблема в том, что вы загружаете свой 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
потому что если пользователь не сможет правильно войти в систему, вы можете просто выйти или обработать его по мере необходимости, не загружая основную форму вообще. То, как вы сейчас это делаете, основная форма должна загружаться до отображения формы входа в систему, что может быть проблематичным.
Ну, вы должны удалить этот код из своей основной формы и вызвать его, прежде чем показывать основную форму.
Или вы можете просто установить глобальную переменную, которая хранит информацию для текущего пользователя в журнале и, если эта переменная не является нулевой, не вызывать снова форму входа
Итак, предположим, что вы входите в форму для формы экземпляра типа 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;
}
}
похоже, вам нужно добавить чек, чтобы узнать, вошел ли пользователь в систему
loginForm.ShowDialog();
что-то вроде
if(!UserLoggedIn())
{
loginForm.ShowDialog();
}