Установите для параметра ReadOnly значение false, но при этом получено сообщение "ReadOnlyException: столбец X доступен только для чтения"
Я новичок в C# и, возможно, похожий вопрос существовал, но он другой.
Компонент: 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
чтобы убедиться, что столбец действительно доступен для записи.
Моя мысль - возможно, ваша настройка в дизайнере является одним (или более) из следующего:
- Не фактический желаемый столбец.
- Не действует, поскольку столбец не создается до тех пор, пока не будет выполнено связывание.
- Переопределено, потому что где-то в коде сбрасывает столбец
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
,