C#中按用户角色控制GridView列显隐失效,求解决方案
问题根源与解决方案
你的问题出在登录时创建的Stocks_Gems实例和你点击「库存详情」按钮后打开的实例不是同一个对象!你在登录代码里new了一个Stocks_Gems并设置列显隐,但这个实例只是临时Show了一下,而用户实际操作时通过主菜单打开的是全新的Stocks_Gems实例,之前的设置自然不会生效。
修复步骤
先存储用户角色到全局变量
首先在你的GlobalVariablesClass里添加一个字段来保存用户角色:public static class GlobalVariablesClass { public static string VariableOne { get; set; } public static string UserRole { get; set; } // 新增:存储用户角色 }修改登录代码,只存储角色,不要提前创建
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(); }在
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
相关产品推荐
相关产品推荐

