I have a DataGridView, which is not set to ReadOnly. None of its columns are set to ReadOnly, and the object it is bound to is not set to ReadOnly. Yet, I can't edit the DataGridView items? The .DataSource property of the DataGridView is set to a ReadOnlyCollection<>, but I can programmatically alter the elements, just not from the UI. What's going on?
It turns out that if your DataGridView is bound to a ReadOnlyCollection, then even though you can programatically edit any item in the collection, the DataGridView will restrict you from changing the values. I'm not sure if this behavior is intentional, but its something to watch out for.
I installed VS 2013 just yesterday, latest build (update 5) and a bug still remains that causes the behavior you describe.
In short to work around the bug, first make sure the datagridview is set to be GUI-editable. This especially includes the tiny arrow in the form designer at the top right of the control. In the arrow drop down is an option "enable editing", ensure it's enabled. Now in the form designer edit the columns in some major manner (such as add or remove a column). That's it, when you run the program you should find the GUI editing is working now.
To reproduce this bug, within the form designer use the tiny arrow at the top right of the datagridview control to set "enable editing" to false. Now make a major change to the columns (such as add or remove a column). Compile and run the program. Now go back to the tiny arrow and re-enable "enable editing" checkbox. Again run the program. At this point the bug manifests itself, and you will find that the datagridview is not GUI-editable even though you've configured otherwise in the VS.
This is just an extended comment (hence wiki) in counter to the "the DataGridView will restrict you from changing some values (strings) but not other values (bools)" point; neither is editable; make it a List<T>
and both are editable...:
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
}
}
});
}
}
How are you binding to your DataGridView? One thing is that if you are using a Linq list as the datasource queried from a database and you do not have the complete object, then the properties are readonly unless you specify "with new" in the select function. There is not a lot of information in your post. I hope this helps.
If you have bound the grid to a collection which has been defined globally , try to create a local clone copy of the collection in the spot(function) you are binding in and bind the grid to the new collection. That worked for me.
I put 2-5 hours searching on it, Just make VirtualMode
property of datagridview false
, now we can set data to datagridview cells programmatically.
Nothing worked for me. I didn't use binding. Just made everything NOT read only and set edit mode to (tried all values). The cells were always read-only.
The way I made it work was to set the cell to ReadOnly = false in the event handler:
private void gridViewSettings_CellClick(object sender,dataGridViewCellEventArgs e)
{
gridViewSettings.CurrentCell = gridViewSettings.Rows[e.RowIndex].Cells[e.ColumnIndex];
gridViewSettings.CurrentCell.ReadOnly = false;
gridViewSettings.BeginEdit(true);
}
At the end of this handler, the cell is in edit mode (the cell I clicked on). Made the changes in the GUI and the rest (if any) is handled in the CellEndEdit event handler. This handler is called when the mouse goes out of cell or you press Enter.
At this point the new value is saved in CurrentCell.Value;
String newValue = (String)gridViewSettings.CurrentCell.Value;
Take datagridview
task and click on edit column then set the column Read Only Property to False
© 2022 - 2025 — McMap. All rights reserved.