以编程方式更改DataGridView行的只读模式

本文关键字:只读 模式 DataGridView 编程 方式更 | 更新日期: 2023-09-27 17:49:26

在不解释整个上下文的情况下,我的问题基本上是:

我在Windows窗体上有一个数据网格视图,它绑定到实体框架数据库集:dbSet<TEntity>.Local.ToBindingList()

如果我将datagridview的ReadOnly属性设置为true(在设计视图中(,然后在我的代码中有以下语句:

  myDataGridView.Rows[rowIndex].ReadOnly = false;

它在不改变值的情况下直接通过!(不,我的数据源不是只读的。(

遍历行中的单元格并单独设置每个单元格的ReadOnly属性也不起作用:

  foreach (DataGridViewCell cell in myDataGridView.Rows[rowIndex].Cells)
  {
      cell.ReadOnly = false;
  }

ReadOnly-Gets or sets a value indicating whether the user can edit the cells of the DataGridView control.但由于某种原因,它的行为似乎无法设置。

发生这种情况有什么原因吗?我在想,也许datagridview的ReadOnly属性会覆盖对特定行/单元格所做的任何更改(即整个表单必须是只读的或非只读的(,但显然这对某人有效。。。

还有其他方法可以实现我的最终目标,但我想知道为什么我不能更改此属性,因为这将是解决我的情况最简单的方法。


编辑:

让我试着澄清我的问题:

同样,我知道还有其他方法可以实现我的最终目标,但我想知道这个问题的答案:

很抱歉出现了原始的例子,但为了轻松地复制这个问题,请创建一个WinForm应用程序,在上面抛出一个数据网格视图,并将此代码传递到您的项目中:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.ReadOnly = true;
        string[] row1 = new string[] { "test", "test1" };
        string[] row2 = new string[] { "test2", "test3" };
        string[] row3 = new string[] { "test4", "test5" };
        dataGridView1.Columns.Add("1", "1");
        dataGridView1.Columns.Add("2", "2");
        dataGridView1.Rows.Add(row1);
        dataGridView1.Rows.Add(row2);
        dataGridView1.Rows.Add(row3);
        dataGridView1.Rows[1].ReadOnly = false;
    }
}

如果您在最后一行放置断点,并逐步通过它,您将看到ReadOnly属性不会更改!为什么?

以编程方式更改DataGridView行的只读模式

所以我找到了解决问题的方法,尽管我仍然不确定为什么。。。

显然,如果您想逐行更改DataGridView的ReadOnly属性,则不能设置mainDataGridView。ReadOnly属性,显然这会覆盖任何后续更改。

要重复使用我以前的示例,解决方法是遍历行并设置每个ROW的ReadOnly属性(而不是设置datagridview的ReadOnly属性(,然后您可以单独更改每行的ReadOnly属性:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        //dataGridView1.ReadOnly = true;
        string[] row1 = new string[] { "test", "test1" };
        string[] row2 = new string[] { "test2", "test3" };
        string[] row3 = new string[] { "test4", "test5" };
        dataGridView1.Columns.Add("1", "1");
        dataGridView1.Columns.Add("2", "2");
        dataGridView1.Rows.Add(row1);
        dataGridView1.Rows.Add(row2);
        dataGridView1.Rows.Add(row3);
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            row.ReadOnly = true;
        }
        dataGridView1.Rows[1].ReadOnly = false;
    }
}

这对我来说非常有效,但如果能深入了解为什么我最初问题中的代码不能正确工作,我们将不胜感激!