为什么我不能编辑DataGridView中的值,即使它没有设置为ReadOnly?

时间:2009-05-27 12:23:44

标签: .net winforms datagridview editing

我有一个DataGridView,它没有设置为ReadOnly。它的所有列都没有设置为ReadOnly,并且它绑定的对象未设置为ReadOnly。但是,我无法编辑DataGridView项目? DataGridView的.DataSource属性设置为ReadOnlyCollection<>,但我可以通过编程方式更改元素,而不是从UI。发生了什么事?

7 个答案:

答案 0 :(得分:10)

事实证明,如果您的DataGridView绑定到ReadOnlyCollection,那么即使您可以以编程方式编辑集合中的任何项目,DataGridView也会限制您更改值。我不确定这种行为是否是故意的,但需要注意。

答案 1 :(得分:3)

这只是一个扩展注释(因此维基)反对“DataGridView会限制你改变某些值(字符串)而不是其他值(bools)”指向;既不可编辑;将它设为List<T>并且两者都可编辑......:

using System;
using System.Collections.ObjectModel;
using System.Windows.Forms;
class Test
{
    public string Foo { get; set; }
    public bool Bar { get; set; }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        var data = new ReadOnlyCollection<Test>(
            new[] {
                new Test {Foo="abc", Bar=true},
                new Test {Foo="def", Bar=false},
                new Test {Foo="ghi", Bar=true},
                new Test {Foo="jkl", Bar=false},
            });
        Application.Run(
            new Form {
                Text = "ReadOnlyCollection test",
                Controls = {
                    new DataGridView {
                        Dock = DockStyle.Fill,
                        DataSource = data,
                        ReadOnly = false
                    }
                }
            });
    }
}

答案 2 :(得分:3)

我昨天安装了VS 2013,最新版本(更新5),但仍然存在导致您描述的行为的错误。

简而言之,要解决这个问题,首先要确保将datagridview设置为GUI可编辑。这尤其包括控件右上角表单设计器中的小箭头。在箭头下拉菜单中是一个选项&#34;启用编辑&#34;,确保它已启用。现在,在表单设计器中以某种主要方式编辑列(例如添加或删除列)。这就是它,当你运行程序时,你会发现GUI编辑现在正在运行。

要重现此错误,请在表单设计器中使用datagridview控件右上角的小箭头设置&#34;启用编辑&#34;为假。现在对列进行重大更改(例如添加或删除列)。编译并运行程序。现在回到小箭头并重新启用&#34;启用编辑&#34;复选框。再次运行该程序。此时bug会自行显示,您会发现即使您已在VS中另外配置,datagridview也不是GUI可编辑的。

答案 3 :(得分:2)

您如何绑定到DataGridView?有一点是,如果您使用Linq列表作为从数据库查询的数据源并且您没有完整对象,那么除非您在select函数中指定“with new”,否则属性是只读的。您的帖子中没有太多信息。我希望这会有所帮助。

答案 4 :(得分:1)

如果已将网格绑定到已全局定义的集合,请尝试在要绑定的spot(function)中创建该集合的本地克隆副本,然后将网格绑定到新集合。那对我有用。

答案 5 :(得分:0)

没有什么对我有用。我没有使用绑定。只是将所有内容设为非只读并将编辑模式设置为(尝试所有值)。单元格始终是只读的。

我让它工作的方式是在事件处理程序中将单元格设置为 ReadOnly = false:

private void gridViewSettings_CellClick(object sender,dataGridViewCellEventArgs e)
{
        gridViewSettings.CurrentCell = gridViewSettings.Rows[e.RowIndex].Cells[e.ColumnIndex];
        gridViewSettings.CurrentCell.ReadOnly = false;
        gridViewSettings.BeginEdit(true);
}

在此处理程序的末尾,单元格处于编辑模式(我单击的单元格)。在 GUI 中进行更改,其余(如果有)在 CellEndEdit 事件处理程序中处理。当鼠标离开单元格或按 Enter 键时,将调用此处理程序。
此时新值保存在CurrentCell.Value;

String newValue = (String)gridViewSettings.CurrentCell.Value;

答案 6 :(得分:-2)

执行datagridview任务,然后点击编辑列,然后点击set the column Read Only Property to False