c# - DataGridView 中的复选框未选中
问题描述
我创建一个 DataGridView 如下
private void IniciarGV()
{
using (var db = new Entities())
{
var ListaPantallas = (from a in db.PANTALLAS
select a).ToList();
if (ListaPantallas != null)
{
gvPermisos.DataSource = ListaPantallas;
gvPermisos.Columns["idPantalla"].Visible = false;
gvPermisos.Columns["nombrepantalla"].HeaderText = "Nombre";
//gvPermisos.Columns.Add(new DataGridViewCheckBoxColumn());
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.HeaderText = "Seleccione";
checkBoxColumn.Width = 50;
checkBoxColumn.Name = "checkBoxColumn";
gvPermisos.Columns.Insert(0, checkBoxColumn);
//gvPermisos.EndEdit();
}
db.Dispose();
}
}
之后,ai 使用相同的方法 linq 检索权限
var TraerPermisos = (from a in db.PERMISOS
where a.IDUSUARIO == UsuarioEditar.idUsuario
select a).ToList();
在我通过 gridview 将权限与我想要检查的 id 匹配之后,用户可以编辑它们,但由于某种原因,它们总是显示为未标记
到目前为止,这是我在每个论坛或谷歌遇到的,但它似乎不起作用
foreach (PERMISOS item in TraerPermisos)
{
foreach (DataGridViewRow row in gvPermisos.Rows)
{
var ValorPermisoEnGV = Convert.ToBoolean(row.Cells["checkBoxColumn"].Value);
var ValorPantalla = decimal.Parse(row.Cells["idPantalla"].Value.ToString());
if (ValorPantalla == item.IDPANTALLA)
{
row.Cells["checkBoxColumn"].Value = true;
}
}
}
我在开始时加载权限
public ManejarUsuario()
{
InitializeComponent();
IniciarComboBox();
IniciarGV();
if (UsuarioEditar.idUsuario != 0)
{
CargarDatos();
btnCrearUsuario.Text = "Editar";
CargarPrivilegios();
}
}
很抱歉这篇文章很长,我尝试了很多选择,但似乎没有一个有效
解决方案
如果您只是在驱动网格的数据中放置一个布尔值,生活会容易得多。首先,让我们为您的信息创建一个持有人课程
class Perms{
public int IdPantalla { get; set; }
public string NombrePantalla { get; set; }
public bool HasPermission { get; set; }
}
然后让我们让查询生成这些列表:
//get all the IDPANTALLA this user has and put in a hash set
var TraerPermisos = (from a in db.PERMISOS
where a.IDUSUARIO == UsuarioEditar.idUsuario
select a.IDPANTALLA).ToHashSet();
//make a list of objects that includes a bool of whether the user has that permission
//note you should have this be a class level variable for ease of use later/elsewhere
ListaPantallas = (from a in db.PANTALLAS
select new Perms {
IdPantalla a.IdPantalla,
HasPermission = TraerPermisos.Contains(a.idPantalla) ,
NombrePantalla = a.nombrepantalla
}).ToList();
然后设置网格:
gvPermisos.DataSource = ListaPantallas;
gvPermisos.Columns["IdPantalla"].Visible = false;
gvPermisos.Columns[ "NombrePantalla"].HeaderText = "Nombre";
gvPermisos.Columns[ "HadPermission"].HeaderText = "Seleccione";
网格将在列表中找到 bool 属性并将其连接起来作为检查列。它不需要你为它创建一个专栏。然后,您勾选的任何内容都作为真/假存储在基础列表中,您可以例如foreach(var x in ListaPantallas) if(x.HasPermission...
操作绑定到数据源的 DGV 中的数据时,请操作源。还要考虑让 Perms 实现 INotifyPropertyChanged(并考虑切换到使用绑定列表)
推荐阅读
- scala - 将日期列与 spark sql 中的最大日期进行比较
- django - 通过在 django 中的模板上使用过滤器对象获取查询集
- asp.net - 如何在通过分页抓取网页时与 .aspx 服务器保持会话?
- python - 如何使用 OpenGL 在旅途中更改旋转半径
- swift - 不同颜色的UILabel
- html - 当窗口随 svg 减小时,形状会发生变化
- ios - 如何从 IOS swift 中的通知中读取自定义数据
- powershell - 用于运行 2 个 exe 的 Powsershell 脚本 - 具有管理员权限和当前登录用户
- laravel-5 - 如何为 auth()->guard('user')->id 设置新值?
- c++ - 为什么 MQTT 的传输速度这么慢