Установите для параметра ReadOnly значение false, но при этом получено сообщение "ReadOnlyException: столбец X доступен только для чтения"

Я новичок в C# и, возможно, похожий вопрос существовал, но он другой. Скриншот ReadOnlyException

Компонент: DataGridView

Дело: у меня есть DataGridView который заполняется из базы данных с помощью DataSource, С другой стороны у меня есть Form это используется для просмотра и редактирования строки данных. После успешного обновления я хочу изменить данные строки в DataGridView напрямую - используя этот код:

int rowIndex= 0;
DataGridViewRow row= dtgMasterAsset.Rows[rowIndex];

row.Cells[1].Value = "NEW ASSET NAME"; // ITEM_NAME
row.Cells[2].Value = "NEW CATEGORY NAME"; // ITEM_CATEGORY_NAME

В процессе, Cells[1] успешно обновлен, но не так с Cells[2], Появляется сообщение об ошибке:

Столбец ITEM_CATEGORY_NAME доступен только для чтения.

Я пытаюсь изменить ITEM_CATEGORY_NAME столбец к Readonly = false в конструктор и добавил строку row.Cells[2].Readonly= false; просто чтобы убедиться в этом снова.

Но ошибка все еще появляется. Зачем? Любое объяснение?

Спасибо.

К вашему сведению: Весь код в одном классе.

4 ответа

Решение

Как указала W0lfw00ds, вы можете проверить, dtgMasterAsset.ReadOnly является true,

Тем не менее, вы заявили:

Cells[1] успешно обновлен

Следовательно, dtgMasterAsset.ReadOnly должен быть false, Также вы заявили, что пытались:

row.Cells[2].ReadOnly = false;
row.Cells[2].Value = "NEW CATEGORY NAME";

Единственный способ для этого потерпеть неудачу, если row.Cells[2].ReadOnly отменяется dtgMasterAsset.Columns[2].ReadOnly являющийся true, Как говорится в сообщении об ошибке, проблема заключается в столбце.


Несмотря на это вы установили:

ITEM_CATEGORY_NAME столбец к Readonly = false

Я думаю, что вы должны проверить, если dtgMasterAsset.Columns[2].ReadOnly является false прежде чем установить row.Cells[2].Value чтобы убедиться, что столбец действительно доступен для записи.

Моя мысль - возможно, ваша настройка в дизайнере является одним (или более) из следующего:

  1. Не фактический желаемый столбец.
  2. Не действует, поскольку столбец не создается до тех пор, пока не будет выполнено связывание.
  3. Переопределено, потому что где-то в коде сбрасывает столбец ReadOnly,

Просто нашел виновника.

Вот как я заполняю DataGridView

String query= "SELECT * FROM VW_ASSET_LIST "; // SQL View 
SqlCommand queryCommand= new SqlCommand(query, connection);

SqlDataReader resultsSet= queryCommand.ExecuteReader();
DataTable dtAsset = new DataTable();
dtAsset.Load(resultsSet);
dtgMasterAsset.DataSource = dtAsset;

Каким-то образом DataGridView блокирует систему для переустановки / установки столбца, который заполняется из столбца псевдонима SQL-запроса ( псевдоним таблицы SQL). Чтобы исправить это, просто привяжите столбец к другому столбцу без псевдонимов. Другой путь? я не знаю:(

Сначала проверьте, что весь DataGridView"s ReadOnly -свойство false:

dtgMasterAsset.ReadOnly = false;

Затем проверьте, что использованные столбцы ReadOnly свойства false, тоже.

После того, как вы прочитали данные из Datatable, столбца, который, по вашему мнению, доступен только для чтения, попробуйте сделать следующее:

dt.Columns[0].ReadOnly = false;

Примечание: dt это ваш объект из datatable, 0 номер вашего столбца в Datatable.

Если вы заполните DataGridView с помощью SqlDataReader, это будет только для чтения. Попробуй использовать SqlDataAdapter,

Другие вопросы по тегам