WinForms DataGridView Checkbox

本文关键字:Checkbox DataGridView WinForms | 更新日期: 2023-09-27 18:30:34

我正在尝试弄清楚如何将dataGridView中的单元格设置为只读。
该复选框由布尔属性添加。因此,我正在寻找如何完成基于具有布尔属性的列将单元格设置为只读的任务的提示。

下面是我的代码片段。

[DisplayName("Lock")]
public bool RevenueLock { get; set; }
revenue = new DomesticCostRevenue()
{
RevenueLock = Convert.ToBoolean(values[10]),
Revenue = Convert.ToDouble(values[11])
};
domestic.Add(revenue);
}
CostRevenueGridView.DataSource = domestic;

这就是我所做的,但到目前为止还没有成功。

foreach (DataGridViewRow row in CostRevenueGridView.Rows)
{
if ((bool)row.Cells["RevenueLock"].Value == true)
{
row.Cells["Revenue"].ReadOnly = true;
//MessageBox.Show("Lock");
}
}

WinForms DataGridView Checkbox

您可以将整列、整行或特定单元格设置为只读:

  • 列: this.dataGridView1.Columns[1].ReadOnly = true;
  • 行: this.dataGridView1.Rows[0].ReadOnly = true;
  • 手机: this.dataGridView1.Rows[0].Cells[1].ReadOnly = true;

测试

将以下代码放在按钮单击或其他位置以向您显示表单。在第一行中,第二个单元格将是只读的,因为第一个单元格值为 true:

var f = new Form();
f.Controls.Add(new DataGridView
{
    Name = "g",
    Dock = DockStyle.Fill
});
f.Load += (se, ev) =>
{
    var g = ((Form)se).Controls["g"] as DataGridView;
    g.AutoGenerateColumns = true;
    g.AllowUserToAddRows = false;
    g.DataSource = new List<C1>
    {
        new C1{P1=true, P2="x"},
        new C1{P1=false, P2="y"},
    };
    foreach (DataGridViewRow row in g.Rows)
    {
        if ((bool)row.Cells["P1"].Value == true)
            row.Cells["P2"].ReadOnly = true;
    }
};
f.ShowDialog();

这是 C1 类的代码:

public class C1
{
    public bool P1 { get; set; }
    public string P2 { get; set; }
}

问题也不存在DataTable

f.Load += (se, ev) =>
{
    var g = ((Form)se).Controls["g"] as DataGridView;
    g.AutoGenerateColumns = true;
    g.AllowUserToAddRows = false;
    var dt = new DataTable();
    dt.Columns.Add("P1", typeof(bool));
    dt.Columns.Add("P2", typeof(string));
    dt.Rows.Add(true, "x");
    dt.Rows.Add(false, "y");
    g.DataSource = dt;
    foreach (DataGridViewRow row in g.Rows)
    {
        if ((bool)row.Cells["P1"].Value == true)
            row.Cells["P2"].ReadOnly = true;
    }
};

我通过创建一个DataTable,填充与您的列匹配的两列,然后使用您发布的foreach循环来重新创建您的问题。我的结果和你的一样。ReadOnly的各个单元格仍可编辑。

我不确定为什么会这样,但是由于 Reza 让它与List<T>一起工作,我认为它与DataTable有关。

尝试订阅RowsAdded事件,并将您的支票移入其中。列名可能不适用于此代码...如果没有,请改用列索引。

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    for (int index = e.RowIndex; index <= e.RowIndex + e.RowCount - 1; index++)
    {
        var currentRow = dataGridView1.Rows[index];
        if (Convert.ToBoolean(currentRow.Cells[0].Value))
            currentRow.Cells[1].ReadOnly = true;
    }
}

感谢您的帮助。 我终于能够解决我的问题了。 下面的代码片段是我的解决方案。

    private void CostRevenueGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        foreach (DataGridViewRow row in CostRevenueGridView.Rows)
        {
            foreach (DataGridViewCell cell in row.Cells)
            {
                if (cell.ColumnIndex == 12)
                {
                    if (Convert.ToBoolean(CostRevenueGridView.Rows[row.Index].Cells[cell.ColumnIndex].Value))
                    {
                        row.Cells[11].ReadOnly = true;
                    }
                }
            }
        }
    }