如何禁用数据网格视图复选框列中的特定复选框单元格

本文关键字:复选框 单元格 数据 数据网 网格 视图 何禁用 | 更新日期: 2023-09-27 18:32:23

我有一个带有DataGridView控件的winForm。它包含 5 列,其中一列是复选框列。我想根据同一行另一列中的值启用/禁用此列的复选框单元格。

我可以使用禁用复选框单元格禁用整个列

但它使整个列处于禁用状态。

这是DataGridView的一个片段,

源专栏 |目标列
真                  |启用
真                  |启用
假                 |禁用

有没有人知道,如何在.Net中实现这一点。

如何禁用数据网格视图复选框列中的特定复选框单元格

Vijay,

DataGridViewCheckBoxColumn 没有名为 disabled 的属性,因此通过更改复选框的样式,可以使其看起来像是禁用的。请看下面的代码。

 private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
    {
        if (e.RowIndex == 1)
        {
            DataGridViewCell cell=dataGridView1.Rows[e.RowIndex].Cells[0];
            DataGridViewCheckBoxCell chkCell = cell as DataGridViewCheckBoxCell;
            chkCell.Value = false;
            chkCell.FlatStyle = FlatStyle.Flat;
            chkCell.Style.ForeColor = Color.DarkGray;
            cell.ReadOnly = true;
        }
    }

我最终做了这样的事情来显示一个实际禁用的复选框:

using System.Windows.Forms.VisualStyles;
public partial class YourForm : Form
{
    private static readonly VisualStyleRenderer DisabledCheckBoxRenderer;
    static YourForm()
    {
        DisabledCheckBoxRenderer = new VisualStyleRenderer(VisualStyleElement.Button.CheckBox.UncheckedDisabled);
    }
    private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
    {
        if (e.RowIndex > -1)
        {
            int checkBoxColumnIndex = this.yourCheckBoxColumn.Index;
            var checkCell = (DataGridViewCheckBoxCell)this.dataGridView[checkBoxColumnIndex, e.RowIndex];
            var bounds = this.dataGridView.GetCellDisplayRectangle(checkBoxColumnIndex , e.RowIndex, false);
            // i was drawing a disabled checkbox if i had set the cell to read only
            if (checkCell.ReadOnly)
            {
                const int CheckBoxWidth = 16;
                const int CheckBoxHeight = 16;
                // not taking into consideration any cell style paddings
                bounds.X += (bounds.Width - CheckBoxWidth) / 2;
                bounds.Y += (bounds.Height - CheckBoxHeight) / 2;
                bounds.Width = CheckBoxWidth;
                bounds.Height = CheckBoxHeight;
                if (VisualStyleRenderer.IsSupported)
                {
                    // the typical way the checkbox will be drawn
                    DisabledCheckBoxRenderer.DrawBackground(e.Graphics, bounds);
                }
                else
                {
                    // this method is only drawn if the visual styles of the application
                    // are turned off (this is for full support)
                    ControlPaint.DrawCheckBox(e.Graphics, bounds, ButtonState.Inactive);
                }
            }
        }
    }
}

尝试对 GridView 使用 RowDataBound 事件。您可以将事件参数强制转换为行,找到此行的控件并禁用它。此事件针对网格视图的每一行触发,即使对于页眉和页脚也是如此,因此尽量不要捕获异常。以下是一些可能对您有用的代码

protected void xxx_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if ((e.Row != null) && e.Row.RowType == DataControlRowType.DataRow)
         foreach (DataGridViewRow row in dataGridView1.Rows)
         {
             var cell = dataGridView1[cellindex, row.Index];
             if (cell.Value != null )
                 if((bool)cell.Value == true)
             {
               ....
             }
         }