Почему я не могу редактировать значения в своем DataGridView, даже если для него не установлено значение ReadOnly?

У меня есть DataGridView, для которого не установлено значение ReadOnly. Ни один из его столбцов не установлен в состояние Только для чтения, а объект, к которому он привязан, не установлен в состояние Только для чтения. Тем не менее, я не могу редактировать элементы DataGridView? Для свойства .DataSource DataGridView задано значение ReadOnlyCollection‹>, но я могу изменять элементы программно, но не из пользовательского интерфейса. Что происходит?


person GWLlosa    schedule 27.05.2009    source источник
comment
Как вы пытаетесь редактировать элементы? Какое поведение, по вашему мнению, вы должны видеть, но не видите?   -  person David    schedule 27.05.2009


Ответы (7)


Оказывается, если ваш DataGridView привязан к ReadOnlyCollection, то, даже если вы можете программно редактировать любой элемент в коллекции, DataGridView не позволит вам изменять значения. Я не уверен, что это поведение преднамеренное, но на это стоит обратить внимание.

person GWLlosa    schedule 27.05.2009
comment
Плохо, оказывается, что единственный столбец, который можно изменить, на самом деле не всегда был правильно привязан к источнику данных. - person GWLlosa; 27.05.2009
comment
+1 Жаль, что я не искал ТАК утром. У меня ушло несколько часов на то, чтобы биться головой о стену, прежде чем я понял это. - person Rytmis; 12.11.2009
comment
Также убедитесь, что для параметра EditMode в вашем представлении сетки установлено значение EditOnKeystrokeOrF2. - person Sal; 21.12.2020

Я установил VS 2013 только вчера, последнюю сборку (обновление 5), и все еще остается ошибка, которая вызывает поведение, которое вы описываете.

Короче говоря, чтобы обойти ошибку, сначала убедитесь, что для datagridview задана возможность редактирования с помощью графического интерфейса. Это особенно относится к крошечной стрелке в конструкторе форм в правом верхнем углу элемента управления. В раскрывающемся списке со стрелкой есть опция «включить редактирование», убедитесь, что она включена. Теперь в дизайнере форм отредактируйте столбцы каким-либо важным образом (например, добавьте или удалите столбец). Вот и все, когда вы запустите программу, вы должны обнаружить, что редактирование графического интерфейса теперь работает.

Чтобы воспроизвести эту ошибку, в дизайнере форм используйте крошечную стрелку в правом верхнем углу элемента управления datagridview, чтобы установить для параметра «Включить редактирование» значение false. Теперь внесите серьезные изменения в столбцы (например, добавьте или удалите столбец). Скомпилируйте и запустите программу. Теперь вернитесь к крошечной стрелке и снова установите флажок «Включить редактирование». Снова запустите программу. В этот момент ошибка проявляется, и вы обнаружите, что представление данных не редактируется с помощью графического интерфейса, даже если вы настроили иное в VS.

person DAG    schedule 15.06.2016

Это просто расширенный комментарий (следовательно, вики) в противовес пункту «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
                    }
                }
            });
    }
}
person Community    schedule 27.05.2009
comment
Упс. Оказывается, один редактируемый столбец на самом деле был опечаткой в ​​коде привязки данных, поэтому на самом деле это был единственный редактируемый столбец, который фактически не был привязан к источнику данных все время. - person GWLlosa; 27.05.2009

Как вы привязываетесь к своему DataGridView? Во-первых, если вы используете список Linq в качестве источника данных, запрашиваемого из базы данных, и у вас нет полного объекта, тогда свойства доступны только для чтения, если вы не укажете «с новым» в функции выбора. В вашем посте не так много информации. Надеюсь, это поможет.

person Joseph Connolly    schedule 27.05.2009

Если вы привязали сетку к коллекции, которая была определена глобально, попробуйте создать локальную клонированную копию коллекции в месте (функции), к которой вы привязываетесь, и привяжите сетку к новой коллекции. Это сработало для меня.

person Reza Iranpour    schedule 15.09.2020

У меня ничего не получалось. Я не использовал привязку. Просто сделал все НЕ только для чтения и установил режим редактирования (пробовал все значения). Ячейки всегда были доступны только для чтения.

Я заставил это работать, установив для ячейки значение 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;
person Gogu CelMare    schedule 06.06.2021

Возьмите datagridview задачу и нажмите на столбец редактирования, затем установите для свойства столбца "Только для чтения" значение False

person Jithu Wilson    schedule 11.02.2016
comment
Пожалуйста, прочитайте заголовок этого вопроса, в нем говорится, что он уже сделал это. - person Stav Bodik; 11.06.2018