8

我有一个未设置为只读的 DataGridView。它的所有列都没有设置为 ReadOnly,并且它绑定的对象也没有设置为 ReadOnly。然而,我不能编辑 DataGridView 项目?DataGridView 的 .DataSource 属性设置为 ReadOnlyCollection<>,但我可以通过编程方式更改元素,但不能从 UI 中更改。这是怎么回事?

4

7 回答 7

11

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

于 2009-05-27T12:24:44.543 回答
5

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

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

要重现此错误,请在表单设计器中使用 datagridview 控件右上角的小箭头将“启用编辑”设置为 false。现在对列进行重大更改(例如添加或删除列)。编译并运行程序。现在回到小箭头并重新启用“启用编辑”复选框。再次运行程序。在这一点上,错误就显现出来了,即使您在 VS 中进行了其他配置,您也会发现 datagridview 不是 GUI 可编辑的。

于 2016-06-15T13:16:14.740 回答
4

这只是与“DataGridView 将限制您更改某些值(字符串)而不是其他值(布尔值)”点相反的扩展评论(因此是 wiki);两者都不可编辑;使它成为一个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
                    }
                }
            });
    }
}
于 2009-05-27T12:31:45.713 回答
3

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

于 2009-05-27T12:52:33.970 回答
1

如果您已将网格绑定到已全局定义的集合,请尝试在要绑定的点(函数)中创建该集合的本地克隆副本,并将网格绑定到新集合。这对我有用。

于 2020-09-15T12:28:12.093 回答
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;
于 2021-06-06T08:38:08.350 回答
-2

接受datagridview任务并单击编辑列,然后将列只读属性设置为 False

于 2016-02-11T12:31:39.483 回答