【问题标题】:Programmatically Changing ReadOnly Mode on DataGridView Rows以编程方式更改 DataGridView 行上的只读模式
【发布时间】:2012-12-21 19:58:10
【问题描述】:

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

我在绑定到实体框架 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属性会覆盖对特定行/单元格所做的任何更改(即整个表单必须是只读的或不是),但显然this工作某人...

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


编辑:

让我试着澄清我的问题:

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

对于原始示例很抱歉,但为了轻松复制问题,请创建一个 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 属性不会更改!为什么??

【问题讨论】:

  • 您的代码隐藏代码何时运行,以及何时将 GridView 的 ReadOnly 属性设置为 true。您确定它们的发生顺序正确吗?
  • @Melanie 我在设计视图中将 GridView 的 ReadOnly 属性设置为 true(不是在运行时)。并且代码在 buttonClick 事件上运行。
  • 所以 buttonClick 事件会导致回发,对吧?或许如果您在 PageLoad() 中将 GridView 的 ReadOnly 属性设置为 true?
  • 抱歉,我应该指定我正在使用 WinForms。 buttonClick 事件正在向 gridview 绑定到的数据源添加一个新项目(基本上,以编程方式添加一行)。我已经尝试在 FormLoad 事件上设置 ReadOnly 属性,但似乎也没有什么不同。
  • 好的,那么您的数据绑定是在您尝试在单元格上设置属性之前还是之后发生的?

标签: c# winforms datagridview readonly


【解决方案1】:

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

显然,如果您想逐行更改 DataGridView 的 ReadOnly 属性,您不能设置 main 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;
    }
}

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

【讨论】:

  • 这应该被接受为答案。这实际上可能没有意义,但我遇到了这个问题,并且单独设置(在我的情况下)列使它们行为正确。
  • @aliceraunsbaek,很高兴它帮助了你!我会标记为答案,直到/除非有人发布更好的解决方案......
  • 如果您想知道WHY,这可能是由于层次结构和.NET 采取了最快的路线。它看到整个视图设置为 ReadOnly = true 并且不使用进一步检查对象的资源。此较高级别会覆盖较低级别的设置。
  • @VenerableAgents 对我来说听起来很合理......太糟糕了 .NET 不能更聪明一点,但我可以理解为什么它会检查这种方式以节省时间/资源......谢谢为了洞察力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多