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

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

5 ответов


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


Это просто расширенный комментарий (следовательно, wiki) в противовес" 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
                    }
                }
            });
    }
}

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

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

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


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


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