У меня есть DataGridView, для которого не установлено значение ReadOnly. Ни один из его столбцов не установлен в состояние Только для чтения, а объект, к которому он привязан, не установлен в состояние Только для чтения. Тем не менее, я не могу редактировать элементы DataGridView? Для свойства .DataSource DataGridView задано значение ReadOnlyCollection‹>, но я могу изменять элементы программно, но не из пользовательского интерфейса. Что происходит?
Почему я не могу редактировать значения в своем DataGridView, даже если для него не установлено значение ReadOnly?
Ответы (7)
Оказывается, если ваш DataGridView привязан к ReadOnlyCollection, то, даже если вы можете программно редактировать любой элемент в коллекции, DataGridView не позволит вам изменять значения. Я не уверен, что это поведение преднамеренное, но на это стоит обратить внимание.
Я установил VS 2013 только вчера, последнюю сборку (обновление 5), и все еще остается ошибка, которая вызывает поведение, которое вы описываете.
Короче говоря, чтобы обойти ошибку, сначала убедитесь, что для datagridview задана возможность редактирования с помощью графического интерфейса. Это особенно относится к крошечной стрелке в конструкторе форм в правом верхнем углу элемента управления. В раскрывающемся списке со стрелкой есть опция «включить редактирование», убедитесь, что она включена. Теперь в дизайнере форм отредактируйте столбцы каким-либо важным образом (например, добавьте или удалите столбец). Вот и все, когда вы запустите программу, вы должны обнаружить, что редактирование графического интерфейса теперь работает.
Чтобы воспроизвести эту ошибку, в дизайнере форм используйте крошечную стрелку в правом верхнем углу элемента управления datagridview, чтобы установить для параметра «Включить редактирование» значение false. Теперь внесите серьезные изменения в столбцы (например, добавьте или удалите столбец). Скомпилируйте и запустите программу. Теперь вернитесь к крошечной стрелке и снова установите флажок «Включить редактирование». Снова запустите программу. В этот момент ошибка проявляется, и вы обнаружите, что представление данных не редактируется с помощью графического интерфейса, даже если вы настроили иное в VS.
Это просто расширенный комментарий (следовательно, вики) в противовес пункту «DataGridView не позволит вам изменить некоторые значения (строки), но не другие значения (логические значения)»; ни то, ни другое не редактируется; сделайте его 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 в качестве источника данных, запрашиваемого из базы данных, и у вас нет полного объекта, тогда свойства доступны только для чтения, если вы не укажете «с новым» в функции выбора. В вашем посте не так много информации. Надеюсь, это поможет.
Если вы привязали сетку к коллекции, которая была определена глобально, попробуйте создать локальную клонированную копию коллекции в месте (функции), к которой вы привязываетесь, и привяжите сетку к новой коллекции. Это сработало для меня.
У меня ничего не получалось. Я не использовал привязку. Просто сделал все НЕ только для чтения и установил режим редактирования (пробовал все значения). Ячейки всегда были доступны только для чтения.
Я заставил это работать, установив для ячейки значение 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);
}
В конце этого обработчика ячейка находится в режиме редактирования (ячейка, на которую я нажал). Внесены изменения в графический интерфейс, а остальное (если есть) обрабатывается в обработчике событий CellEndEdit. Этот обработчик вызывается, когда мышь выходит из ячейки или вы нажимаете Enter.
В этот момент новое значение сохраняется в CurrentCell.Value;
String newValue = (String)gridViewSettings.CurrentCell.Value;
Возьмите datagridview
задачу и нажмите на столбец редактирования, затем установите для свойства столбца "Только для чтения" значение False