You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中按用户角色控制GridView列显隐失效,求解决方案

问题根源与解决方案

你的问题出在登录时创建的Stocks_Gems实例和你点击「库存详情」按钮后打开的实例不是同一个对象!你在登录代码里new了一个Stocks_Gems并设置列显隐,但这个实例只是临时Show了一下,而用户实际操作时通过主菜单打开的是全新的Stocks_Gems实例,之前的设置自然不会生效。

修复步骤

  1. 先存储用户角色到全局变量
    首先在你的GlobalVariablesClass里添加一个字段来保存用户角色:

    public static class GlobalVariablesClass
    {
        public static string VariableOne { get; set; }
        public static string UserRole { get; set; } // 新增:存储用户角色
    }
    
  2. 修改登录代码,只存储角色,不要提前创建Stocks_Gems
    把登录代码里创建Stocks_Gems的部分删掉,只保留角色存储逻辑:

    try {
     SqlCommand selectCommand = new SqlCommand(" Select * from New_User where User_Name=@USER_ID and Password=@PASS", conn);
     selectCommand.Parameters.Add(new SqlParameter("USER_ID", txtusername.Text.ToString()));
     String password = "";
     using (SHA1 sha1 = SHA1.Create()) {
      byte[] data = sha1.ComputeHash(Encoding.UTF8.GetBytes(txtpassword.Text));
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < data.Length; ++i) {
       sb.Append(data[i].ToString("x2"));
      }
      password = sb.ToString();
     }
     selectCommand.Parameters.Add(new SqlParameter("PASS", password));
     string UserType = null;
     SqlDataReader reader = selectCommand.ExecuteReader();
     bool rowfound = reader.HasRows;
     if (rowfound) {
      while (reader.Read()) {
       UserType = reader["User_Type"].ToString().Trim();
       // 存储用户角色到全局变量
       GlobalVariablesClass.UserRole = UserType;
       GlobalVariablesClass.VariableOne = txtusername.Text;
       
       if (UserType == "Administrator") {
        MessageBox.Show("Welcome ", "Admin Login", MessageBoxButtons.OK, MessageBoxIcon.Information);
        Admin_Menu frm = new Admin_Menu();
        frm.bunifuFlatButton3.Visible = true;
        frm.Show();
        this.Hide();
       } else if (UserType == "StockController") {
        MessageBox.Show("Welcome ", "User Login", MessageBoxButtons.OK, MessageBoxIcon.Information);
        Admin_Menu frm = new Admin_Menu();
        frm.bunifuFlatButton3.Visible = false;
        frm.Show();
        this.Hide();
       }
      }
     } else {
      MessageBox.Show(" Invalid User Or Password ", "Login ", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
     reader.Close();
    }
    
  3. 在Stocks_Gems的Load事件中设置列显隐
    打开Stocks_Gems用户控件的代码,添加Load事件处理逻辑(如果没有Load事件,双击控件自动生成):

    private void Stocks_Gems_Load(object sender, EventArgs e)
    {
        // 优先用列名而不是索引,避免列顺序变动导致错误
        if (GlobalVariablesClass.UserRole == "Administrator")
        {
            dataGridView1.Columns["UserID"].Visible = true;
        }
        else if (GlobalVariablesClass.UserRole == "StockController")
        {
            dataGridView1.Columns["UserID"].Visible = false;
        }
    }
    

为什么这样有效?

现在不管你什么时候打开Stocks_Gems控件,它都会在加载时读取全局变量里的用户角色,然后动态设置列的显隐——这时候作用的是当前正在显示的那个实例,自然会生效。另外用列名代替索引是个好习惯,万一以后你调整了GridView的列顺序,代码也不会出错。

内容的提问来源于stack exchange,提问作者Mohamed Anver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:46:09