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


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

5 8

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

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

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

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