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