我有一个未设置为只读的 DataGridView。它的所有列都没有设置为 ReadOnly,并且它绑定的对象也没有设置为 ReadOnly。然而,我不能编辑 DataGridView 项目?DataGridView 的 .DataSource 属性设置为 ReadOnlyCollection<>,但我可以通过编程方式更改元素,但不能从 UI 中更改。这是怎么回事?
7 回答
事实证明,如果您的 DataGridView 绑定到 ReadOnlyCollection,那么即使您可以以编程方式编辑集合中的任何项目,DataGridView 也会限制您更改值。我不确定这种行为是否是故意的,但需要注意。
我昨天刚刚安装了 VS 2013,最新版本(更新 5)并且仍然存在导致您描述的行为的错误。
简而言之,要解决该错误,首先确保将 datagridview 设置为 GUI 可编辑。这尤其包括控件右上角的表单设计器中的小箭头。在箭头下拉菜单中有一个“启用编辑”选项,确保它已启用。现在在表单设计器中以某种主要方式编辑列(例如添加或删除列)。就是这样,当您运行程序时,您应该会发现 GUI 编辑现在正在工作。
要重现此错误,请在表单设计器中使用 datagridview 控件右上角的小箭头将“启用编辑”设置为 false。现在对列进行重大更改(例如添加或删除列)。编译并运行程序。现在回到小箭头并重新启用“启用编辑”复选框。再次运行程序。在这一点上,错误就显现出来了,即使您在 VS 中进行了其他配置,您也会发现 datagridview 不是 GUI 可编辑的。
这只是与“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
}
}
});
}
}
你是如何绑定到你的 DataGridView 的?一件事是,如果您使用 Linq 列表作为从数据库查询的数据源并且您没有完整的对象,那么属性是只读的,除非您在 select 函数中指定“with new”。您的帖子中没有很多信息。我希望这有帮助。
如果您已将网格绑定到已全局定义的集合,请尝试在要绑定的点(函数)中创建该集合的本地克隆副本,并将网格绑定到新集合。这对我有用。
没有什么对我有用。我没有使用绑定。只是将所有内容都设为非只读并将编辑模式设置为(尝试了所有值)。单元格始终是只读的。
我使它工作的方法是在事件处理程序中将单元格设置为 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;
接受datagridview
任务并单击编辑列,然后将列只读属性设置为 False