C# 将ReadOnly设置为false,但仍然得到;ReadOnlyException:X列为只读;

C# 将ReadOnly设置为false,但仍然得到;ReadOnlyException:X列为只读;,c#,winforms,datagridview,C#,Winforms,Datagridview,我是C#的新手,可能存在类似的问题,但不同。 组件:DataGridView String query= "SELECT * FROM VW_ASSET_LIST "; // SQL View SqlCommand queryCommand= new SqlCommand(query, connection); SqlDataReader resultsSet= queryCommand.ExecuteReader(); DataTable dtAsset = new DataTable(

我是C#的新手,可能存在类似的问题,但不同。

组件:
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
,它是使用
DataSource
从数据库填充的。另一方面,我有一个
表单
,用于查看和编辑一行数据。成功更新后,我想直接更改
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
在此过程中,
单元格[1]
已成功更新,但
单元格[2]
则未成功更新。将弹出一条错误消息,说明:

列项目\类别\名称为只读

我尝试将设计器中的
项目\u类别\u名称
列更改为
只读=false
,并添加了一行
行。单元格[2]。只读=false只是为了再次确认

但是错误还是出现了。为什么? 有什么解释吗

多谢各位


仅供参考:所有代码都在同一个类上。

首先检查整个
DataGridView
只读属性是否为
false

dtgMasterAsset.ReadOnly=false

然后检查使用的列“
ReadOnly
”属性是否也为
false

如前所述,您可以检查
dtgMasterAsset.ReadOnly
是否为
true

但是,你说:

单元格[1]
已成功更新

因此,
dtgMasterAsset.ReadOnly
必须为
false
。此外,您还表示您已尝试:

此操作失败的唯一方法是,如果
行.Cells[2]。只读
dtgMasterAsset.Columns[2]覆盖。只读
true
。正如错误所述,问题在于列


尽管你设置了:

ITEM\u CATEGORY\u NAME
列至
Readonly=false

我认为在设置
row.Cells[2]。Value
之前,应该检查
dtgMasterAsset.Columns[2]。ReadOnly
是否为
false
,以确保该列确实可写

我的想法是-也许您在designer中的设置是以下一个(或多个):

  • 不是所需的实际列
  • 无效,因为在绑定发生之前不会创建列
  • 重写,因为代码中的某个地方将列重置为
    只读

  • 刚刚找到罪犯

    这就是我如何填充
    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查询列()填充的列。要修复它,只需将该列绑定到另一个无别名的列。
    其他方式?我不知道:(

    如果使用
    SqlDataReader
    填充
    DataGridView
    ,它将是只读的。
    尝试使用
    SqlDataAdapter

    从Datatable(您称之为只读的列)读取数据后,尝试执行以下操作:

    dt.Columns[0].ReadOnly = false;
    

    注意:dt它是datatable中的对象,datatable中列的编号为0。

    我只是再次检查它,dtgMasterAsset.ReadOnly为false且未被覆盖。DataGridView的属性ReadOnly为false,列ReadOnly为FalseTooth
    DataGridViewRow
    s也可以是
    ReadOnly
    。很高兴您找到它并共享了,很高兴知道!我不需要将别名列与
    数据源
    绑定结合使用。请在回答中提供一个示例或一些解释。有关更多详细信息,请参阅