微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用户登录后将按钮更改为可见

如何解决用户登录后将按钮更改为可见

我创建了一个带有连接的 sql 数据库一个带有用户和密码的表。我设法按照指南创建了一个登录名。该代码可以正常登录,但我想要做的是在用户登录后在主表单上显示所有其他按钮。
我在主窗体中使用面板来显示第二个窗体。单击按钮会在中间面板中显示一个 UserControl。
我只想将 Button.Visible 值从 false 更新为 true,而无需打开新的主表单。

我可以让按钮在表单加载时可见,但在我尝试设置条件时不可见。我不知道如何设置一个条件,当用户登录成功时,其他按钮设置为可见,登录按钮隐藏。

MainLogin UserControl 中的部分代码
添加MainMenu.UserAutherised 是在登录成功时将 userID 从 TextBox 传递给 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()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();

我在尝试调用新事件时收到 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();

调试时,我可以看到我从数据库表中获取了 Access 值。但是,当我尝试使用带有 if 语句的方法但即使为真时也会跳过条件。我也尝试过 switch 语句,但同样的事情也会发生在案例中。它们被跳过。例如,如果管理员登录我得到 access yellow 但大小写被跳过。同样的事情发生在 if 语句条件上。 Access is yellow 且条件为真但跳过 if 语句。 为什么在条件为真时跳过它们?

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

编辑 2: 我发现了问题。结果是在 User 表中。访问权限设置为 nchar 数据类型,该数据类型为值添加空格。 Access 得到了 string "yellow "。我将数据类型更改为 varchar解决了问题。

解决方法

为什么使用静态方法访问 MainMenu?

我认为在 MainLogin 表单中声明事件会更好,例如:

public event Action<string> userLogged;

并在 this.hide 之后调用它:

userLogged.Invoke(text_userID.Text);

并在 MainMenu 表单中为此事件创建一个处理程序:

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

并在显示 MainLogin 表单之前订阅 userLigged 事件,例如:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。