Измените кнопки на видимые после входа пользователя в систему

#c# #winforms #user-controls #access-modifiers

Вопрос:

Я создал базу данных SQL с подключением и таблицей с пользователем и паролем. Мне удалось создать логин, следуя руководству. Код отлично работает для входа в систему, но я хочу, чтобы все остальные кнопки отображались в основной форме после входа пользователя.
Я использую панель в основной форме для отображения второй формы. Щелчки по кнопкам показывают пользовательский элемент управления на средней панели.
Я просто хочу обновить Button.Visible значение с false до true , не открывая новую основную форму.

Я могу сделать кнопки видимыми при загрузке формы, но не при попытке задать условие. Я не могу понять, как установить условие, при котором при успешном входе пользователя в систему другие кнопки становятся видимыми, а кнопка входа скрыта.

Часть кода в MainLogin пользовательском контроле.
MainMenu.UserAutherised Я добавил, чтобы передать userID из текстового поля в UserAutherised() метод в MainMenu форме при успешном входе в систему.

 if (mread.Read() == true)
{
  MessageBox.Show("Login successfull");
  this.Hide();
  MainMenu.UserAutherised(text_userID.Text);
}
 

Часть кода в MainMenu : Я сделал это, пытаясь решить проблему.
Я думал, что установив bool на true то, что когда пользователь успешно входит в систему, я мог бы затем вызвать ShowButtons() метод, чтобы установить кнопки видимыми:

 public static bool UserAutherised(string user)
{
    bool returnValue;
    string _user ="true";
    string _noUser ="false";
    bool _userID = bool.Parse(_user);
    bool _noUserID = bool.Parse(_noUser);
}

if (user == "")
{
    returnValue = _noUserID;
     return returnValue;
}
else
{
    returnValue = _userID;
    return returnValue;
}
 

Я получаю значение bool, насколько я могу понять из отладки, но когда я пытаюсь использовать if оператор в ShowButtons() методе, я не могу понять, как получить значение bool от UserAutherised() to if(UserAutherised()) , чтобы показывать кнопки, когда значение равно true .
Надеюсь, я достаточно хорошо описал проблему.

ПРАВКА 1:

Я попробовал тот же event Action синтаксис, чтобы получить позицию и доступ для входа пользователя в систему. В MainLogin форму я добавил следующее:

 public event Action<string> ACCESS;
public event Action<string> POSITION;

string userAccess, userPosition;
 

а затем я добавил следующее в mread.Read if-утверждение:

 Sqlcommand cmd_get_position_Access = new SqlCommand (
"SELECT, Access FROM Users WHERE position = @position AND Access = @Access", dataconnection);

SqlParameter _position = new SqlParameter("@position", 
SqlDbType.NVarchar);
SqlParameter _access = new SqlParameter("@Access", SqlDbType.NChar);
cmd.Parameters.Add(_position);
cmd.Parameters.Add(_access);

userPosition = mread["position"].ToString();
userAccess = mread["Access"].ToString();
 

Я получаю a NullReferenceException при попытке вызвать новые события, поэтому я добавил следующий оператор if-else, чтобы исправить это:

 if (ACCESS == null || POSITION == null)
{
  return;
}
else
{
ACCESS.Invoke(userAccess);
POSITION.Invoke(userPosition);
}
 

В MainMenu событии нажатия кнопки:

 var userLogin = new MainLogin();
panel_Main.controls.Add(userLogin);
userLogin.userLogged  = UserLogged;
userLogin.ACCESS  = UserAccess;
userlogin.POSITION  = Position;
userLogin.Show();
 

При отладке я вижу, что получаю значение доступа из таблицы базы данных. Но когда я пытаюсь использовать метод с инструкциями if -, но условия пропускаются, даже если они истинны. Я также пробовал оператор switch, но то же самое происходит со случаями. Их пропускают. Например, если вход администратора я получаю access yellow , но дело пропускается. То же самое происходит с условиями утверждений if. Access is yellow и условие истинно, но если-утверждение пропущено. Почему они пропускаются, когда условия верны?

 private void UserAccess(string access)
{
  switch (access)
  {
     case: "yellow":
           userAdmin();
           break;
     case: "green":
           userGreen();
           break;
     default:
           break;
   }
}
 

ПРАВКА 2:
Я нашел проблему. Он оказывается в таблице пользователей. Для доступа был установлен nchar тип данных, который добавляет пробелы к значению. Access доставалось string "yellow " . Я изменил тип данных varchar на, и это решило проблему.

Ответ №1:

Почему вы используете статический метод для доступа к главному меню?

Я думаю, что было бы лучше объявить событие в форме MainLogin, например:

 public event Action<string> userLogged;
 

и вызовите его после этого.скрыть:

 userLogged.Invoke(text_userID.Text);
 

И в форме главного меню создайте обработчик для этого события:

 void UserLogged(string user)
{
   if (user != "")ShowButtons();
}
 

И подпишитесь на событие, отмеченное как пользователь, прежде чем показывать форму MainLogin, например:

 MainLogin loginForm = new MainLogin();
loginForm.userLigged  = UserLogged;
loginForm.Show();
 

Комментарии:

1. Ух ты! это было так просто. Я не думал об объявлении событий. Это действует как заклинание. Спасибо!