繁体   English   中英

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

[英]Programmatically Changing ReadOnly Mode on DataGridView Rows

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

我在绑定到实体框架 DbSet 的 Windows 窗体上有一个 datagridview: 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 应用程序,在其上抛出一个 datagridview,然后将此代码传递到您的项目中:

 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 的 ReadOnly 属性,则不能设置DataGridView.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;
    }
}

这对我来说很有用,但是任何有关为什么我的原始问题中的代码无法正常工作的见解将不胜感激!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM