Имам DataGridView, който не е настроен на ReadOnly. Нито една от неговите колони не е зададена на ReadOnly и обектът, към който е обвързан, не е зададен на ReadOnly. И все пак не мога да редактирам елементите на DataGridView? Свойството .DataSource на DataGridView е зададено на ReadOnlyCollection‹>, но мога програмно да променя елементите, но не и от потребителския интерфейс. Какво става?
Защо не мога да редактирам стойностите в моя DataGridView, въпреки че не е зададен на ReadOnly?
Отговори (7)
Оказва се, че ако вашият DataGridView е обвързан с ReadOnlyCollection, тогава въпреки че можете програмно да редактирате всеки елемент в колекцията, DataGridView ще ви ограничи да променяте стойностите. Не съм сигурен дали това поведение е умишлено, но трябва да внимавате.
Инсталирах VS 2013 точно вчера, най-новата версия (актуализация 5) и все още остава грешка, която причинява поведението, което описвате.
Накратко, за да заобиколите грешката, първо се уверете, че datagridview е настроен да може да се редактира от GUI. Това включва особено малката стрелка в дизайнера на формуляри в горния десен ъгъл на контролата. В падащото меню със стрелка има опция „разрешаване на редактиране“, уверете се, че е активирана. Сега в дизайнера на формуляри редактирайте колоните по някакъв основен начин (като добавяне или премахване на колона). Това е всичко, когато стартирате програмата, трябва да откриете, че редактирането на GUI вече работи.
За да възпроизведете тази грешка, в рамките на дизайнера на формуляри използвайте малката стрелка в горния десен ъгъл на контролата на datagridview, за да зададете „разрешаване на редактиране“ на false. Сега направете голяма промяна в колоните (като добавяне или премахване на колона). Компилирайте и стартирайте програмата. Сега се върнете към малката стрелка и активирайте отново квадратчето за отметка „разрешаване на редактиране“. Отново стартирайте програмата. В този момент грешката се проявява и ще откриете, че datagridview не може да се редактира с GUI, въпреки че сте конфигурирали друго във VS.
Това е само разширен коментар (следователно 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
}
}
});
}
}
Как се свързвате с вашия 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);
}
В края на този манипулатор клетката е в режим на редактиране (клетката, върху която щракнах). Направете промените в GUI, а останалото (ако има такова) се обработва в манипулатора на събития CellEndEdit. Този манипулатор се извиква, когато мишката излезе извън клетката или натиснете Enter.
В този момент новата стойност се записва в CurrentCell.Value;
String newValue = (String)gridViewSettings.CurrentCell.Value;
Вземете datagridview
задача и щракнете върху колона за редактиране, след което задайте свойството само за четене на колоната на False