BillWoodruff
Когда вы объявляете MDIParent1 M =new MDIParent1 (); внутри метода внутри вашей формы входа: этот экземпляр ' MDIParent1 не существует вне области действия формы входа.
Я думаю, что это лучшая стратегия, чтобы убедиться, что конечный пользователь никогда не "доберется" до основной формы, MDIParentForm, если только вход в систему не является действительным; в этом случае проблема отключения menustrip не возникает. Вот как это сделать:
Предполагая,:
1. форма с именем 'FormMDIParent, которая является "основной формой", которая будет показана после успешного входа в систему.
2. а войти в форму с двумя текстовыми полями, 'tbxPassword, и tbxUserName. И две кнопки: "btnSubmit" и "btnCancel". Журнал-в собственность формы AcceptButton устанавливается значение 'tbxSubmit, и войти в свойство формы 'кнопку Отменить, установлен tbxCancel.
Измените файл Program.cs следующим образом:
using System;
using System.Windows.Forms;
namespace YourMDIProject
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if ((new FormLogIn()).ShowDialog() == DialogResult.OK)
{
Application.Run(new MDIParentForm());
}
}
}
}
Таким образом, приложение показывает форму входа модально; когда форма входа закрыта, если DialogResult является 'OK, то приложение запускает новый экземпляр 'MDIParentForm, который становится "основной формой"."
Теперь посмотрите на логику в " Логинформе:
using System;
using System.Windows.Forms;
namespace YourMDIProject
{
public partial class FormLogIn : Form
{
public FormLogIn()
{
InitializeComponent();
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
private void btnSubmit_Click(object sender, EventArgs e)
{
if (LogInValidator(tbxPassword.Text, tbxUserName.Text))
{
this.DialogResult = DialogResult.OK;
}
else
{
// what now ? cancel ?
// allow the user to repeat again for #n times ?
// do "nothing" here and the Application will terminate
}
}
private bool LogInValidator(string password, string username)
{
// your validation function that returns a 'bool
// goes here
// ????
}
}
Есть еще один способ сделать это, который я предпочитаю использовать, когда вы запускаете приложение с экземпляром ApplicationContext, но я думаю, что этот пример проще и более уместен в данном контексте.
Вы также можете создать EventHandler для события ' FormClosing формы входа в систему и в этом коде получить более подробную информацию о том, почему именно форма входа закрывается, обратившись к перечислению 'CloseReason в аргументах события для этого обработчика событий.
BillWoodruff
Пожалуйста. Иногда лучший способ обойти проблему - это "обойти ее". по моему опыту (как учитель) многие люди, имеющие некоторый опыт работы с WinForms, никогда по-настоящему не смотрели на код в файле Program.cs и не рассматривали, как он "работает"."
Member 12590531
Эй, Биллвудруфф, ваше решение лучше всего, но я получил задание отключить manustrip со страницы входа, где сначала откроется форма mdiparent, а затем я выберу логин, и после этого логин будет отключен, а home, который является другим manustip, включен. он дал намек на то, что будет использоваться какая-то функция "contains".
BillWoodruff
То, что вы описываете здесь, не должно быть так сложно реализовать: сделайте 'MDIParentForm вашей основной формой (не изменяйте файл Program. cs), в событии загрузки 'MDIParentForm покажите' LogInForm с помощью ShowDialog(это);
Установите свойство MainMenuStrip формы Mdiparent в свой MenuStrip, установите видимые и включенные свойства MenuStrip в значение false.
Когда LoginForm, который будет закрыт, интерпретировать значение dialogresult вернулся и поступить правильно установить управления menustrip включен, то видно, свойства значение true. Или, показывают другое меню, в зависимости от значение dialogresult.