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

Posted

技术标签:

【中文标题】在用户登录后将按钮更改为可见【英文标题】:Change Buttons to visible after a User logs in 【发布时间】:2021-10-07 08:32:38 【问题描述】:

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

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

MainLogin UserControl 中的部分代码。 我添加的MainMenu.UserAutherised是登录成功时,将TextBox中的userID传递给MainMenuForm中的UserAutherised()方法。

if (mread.Read() == true)

  MessageBox.Show("Login successfull");
  this.Hide();
  MainMenu.UserAutherised(text_userID.Text);

MainMenu 中的部分代码:我这样做是为了解决问题。 我认为当用户成功登录时将布尔设置为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;

我从调试中得到了布尔值,但是当我尝试在ShowButtons() 方法中使用if 语句时,我无法弄清楚如何从@987654336 中获取布尔值@ 到 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();

调试时我可以看到我从数据库表中获取了访问值。但是,当我尝试使用带有 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,它解决了这个问题。

【问题讨论】:

【参考方案1】:

为什么要使用静态方法访问 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();

【讨论】:

哇!就这么简单。我没有想过要宣布事件。它就像一个魅力。谢谢!

以上是关于在用户登录后将按钮更改为可见的主要内容,如果未能解决你的问题,请参考以下文章

使用 FB 登录构建了一个自定义 html 页面。我想在使用 facebook 登录按钮后将它们重定向到主页

使用 Ionic 2,您如何通过登录后将您发送到另一个页面的模式来更改基于登录状态的按钮?

如何将登录用户更改为另一个用户?

用户登录后,使用我的个人资料选项卡动态更改登录选项卡

登录成功后将视图导航到另一个视图

Spring Boot安全主体用户已更改为新登录的用户详细信息