【问题标题】:Checkbox in DataGridView doesnt CheckDataGridView 中的复选框未选中
【发布时间】:2021-11-08 11:12:58
【问题描述】:

我如下创建一个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();
        }
    }

之后,我使用相同的方法 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();
        }
    }

抱歉,帖子太长了,我尝试了很多选择,但似乎没有一个有效

【问题讨论】:

    标签: c# windows forms desktop datagridviewcheckboxcell


    【解决方案1】:

    如果您在驱动网格的数据中添加一个布尔值,生活会轻松很多。首先,让我们为您的信息创建一个持有者类

    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(并考虑切换到使用绑定列表)

    【讨论】:

    • 解决了这个问题,现在它撤回了所有信息并相应显示,但是又出现了一个问题,现在我无法手动选中或取消选中复选框
    • 编辑:检查后,只读属性设置为 true,但是当我将其设置为 false 时,它​​会抛出异常并转换为如下内容:绑定到只读文件的 DataGridView 列必须已将 ReadOnly 设置为 True
    • 是的,抱歉,我忽略了您希望用户编辑数据的部分。匿名类型是只读的。我已经调整了新版本中的建议,以创建一个您可以使用的可变类
    • 一切正常,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多