Защо не мога да редактирам стойностите в моя DataGridView, въпреки че не е зададен на ReadOnly?

Имам DataGridView, който не е настроен на ReadOnly. Нито една от неговите колони не е зададена на ReadOnly и обектът, към който е обвързан, не е зададен на 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 Иска ми се да бях търсил SO сутринта. Това ми отне часове да си блъскам главата в стената, преди да го разбера. - person Rytmis; 12.11.2009
comment
Също така се уверете, че EditMode на вашия gridview е зададен на EditOnKeystrokeOrF2 - person Sal; 21.12.2020

Инсталирах VS 2013 точно вчера, най-новата версия (актуализация 5) и все още остава грешка, която причинява поведението, което описвате.

Накратко, за да заобиколите грешката, първо се уверете, че datagridview е настроен да може да се редактира от GUI. Това включва особено малката стрелка в дизайнера на формуляри в горния десен ъгъл на контролата. В падащото меню със стрелка има опция „разрешаване на редактиране“, уверете се, че е активирана. Сега в дизайнера на формуляри редактирайте колоните по някакъв основен начин (като добавяне или премахване на колона). Това е всичко, когато стартирате програмата, трябва да откриете, че редактирането на GUI вече работи.

За да възпроизведете тази грешка, в рамките на дизайнера на формуляри използвайте малката стрелка в горния десен ъгъл на контролата на datagridview, за да зададете „разрешаване на редактиране“ на false. Сега направете голяма промяна в колоните (като добавяне или премахване на колона). Компилирайте и стартирайте програмата. Сега се върнете към малката стрелка и активирайте отново квадратчето за отметка „разрешаване на редактиране“. Отново стартирайте програмата. В този момент грешката се проявява и ще откриете, че datagridview не може да се редактира с GUI, въпреки че сте конфигурирали друго във VS.

person DAG    schedule 15.06.2016

Това е само разширен коментар (следователно 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
                    }
                }
            });
    }
}
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);
}

В края на този манипулатор клетката е в режим на редактиране (клетката, върху която щракнах). Направете промените в GUI, а останалото (ако има такова) се обработва в манипулатора на събития 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