#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. Ух ты! это было так просто. Я не думал об объявлении событий. Это действует как заклинание. Спасибо!