DataGridView只读模式下的“bug”

3
我有一个datagridview来显示一些数据。数据之间有一些行是分隔符行,因此这些行是只读的。在某些情况下,整个datagridview可能会是只读的。但是当我将其切换回readonly=false时,所有行都可以编辑。是否有可能让我的行不必手动再次设置每行的readonly属性,而可以像以前一样返回它们?

是的...抱歉,我的意思是将那些只读 = false 的单元格设置为只读 = false,将那些只读 = true 的单元格设置为只读 = true。抱歉,我的表述不够清晰。 - Rémi
3个回答

4
就我所看到的使用Reflector,将DataGridView.ReadOnly设置为true也会将网格中所有行和列的ReadOnly设置为false,大概是认为您永远不会再想将DataGridView.ReadOnly再次设置为false
因此,我唯一能想到的方法是“记住”应该是只读的行,例如通过在DataGridViewRow.Tag中设置适当的值,然后手动使用这个值来恢复ReadOnly状态。
例如,如果您已经为只读行设置了DataGridViewRow.Tag属性的值为true,则可以使用以下未经测试的处理程序处理DataGridView.ReadOnlyChanged事件,代码如下:
void DataGridView_ReadOnlyChanged(object sender, EventArgs e)
{
    DataGridView dataGridView = (DataGridView) sender;
    if (!dataGridView.ReadOnly)
    {
        // DataGridView.ReadOnly has just been set to false, so we need to 
        // restore each row's readonly state.
        foreach(DataGridViewRow row in dataGridView.Rows)
        {
            if (row.Tag != null && ((bool)row.Tag))
            {
                row.ReadOnly = true;
            }
        }
    }
}

然而,很明显 DataGridView 并没有设计成可以以那种方式切换它的ReadOnly属性。也许您可以设计应用程序,使其永远不需要将 DataGridView.ReadOnly 设置为 true
例如,如果您想要防止用户通过双击单元格进行编辑,您可以将 DataGridView.EditMode 设置为 DataGridViewEditMode.EditProgramatically,而不是将 DataGridView.ReadOnly 设置为 true

另外,我相信您可以切换.Enabled而不更改单个行的.ReadOnly值。 - JosephHirn
@Ginosaji,看更新,切换“EditMode”可能比切换“Enabled”更好,因为这样做可以让您仍然从网格中选择值。 - Joe
我会尝试查看EditMode,否则我将不得不再次循环所有行,将它们设置回它们应该是的状态。 - Rémi
@Ginosaji,我认为行/单元格上没有启用功能,仅适用于datagridview级别。 - Rémi
@im_a_noob:我的意思是在网格级别使用“Enabled”,在行/单元格级别使用“ReadOnly”,这样就不会有冲突,也不会被覆盖。虽然如果Joe所说的“EditMode”起作用,那将是更好的解决方案。 - JosephHirn
显示剩余2条评论

0
如果这个类是由你自己实现的,那么你可以设置 DataGrid1.ReadOnly = true 并将需要只读的属性设置为只读。就像这样:
string _myProperty;
public string MyProperty
{
   get{return _myProperty;}
}

我没有实现这个类...但是DataGridView没有绑定。我用我的代码填充它。 - Rémi
这是一段相当长的代码。我并没有看到任何发布它的用处,所以我没有在原帖中包含它。 - Rémi
我建议为此创建一个类,然后您可以轻松地将其绑定到DataGrid或其他任何控件上。 - Dilshod

0
如果您使用代码手动填充DataGridView而不是将其绑定到数据源,则可以在添加行时将该行的只读属性设置为true。
如果上述方法不起作用,那么我不理解您的代码实际上是做什么的,就像@Dilshod所说的那样,如果您发布它或至少链接到它的要点(http://www.gist.github.com),那将很方便。

这是我的做法。我在创建行时设置只读属性。但在某些情况下,DataGridView变为只读(全部),但有些用户有能力将其恢复为只读= false,当他们这样做时,整个网格都变为只读= false,即使那些本来不应该可编辑的行也是如此。 - Rémi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接