C# 将单元格属性绑定到DataBoundItem

C# 将单元格属性绑定到DataBoundItem,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我正在根据存储的值设置的某些属性,例如: DataGridViewRow row; MyObject obj = row.DataBoundItem as MyObject; row.Cells["MyCell"].ReadOnly = !obj.CanBeEdited; 现在我正在滥用事件来设置这些,但问题是datagrid中显示的对象正在从另一个线程更改,我需要在不重新绘制的情况下正确设置这些属性,例如选择多个屏幕的行和编辑多个值 Q:将属性DataBoundItems绑定到单元格属性的正

我正在根据存储的值设置的某些属性,例如:

DataGridViewRow row;
MyObject obj = row.DataBoundItem as MyObject;
row.Cells["MyCell"].ReadOnly = !obj.CanBeEdited;
现在我正在滥用事件来设置这些,但问题是datagrid中显示的对象正在从另一个线程更改,我需要在不重新绘制的情况下正确设置这些属性,例如选择多个屏幕的行和编辑多个值

Q:将属性DataBoundItems绑定到单元格属性的正确方法是什么


是否有一些方法可以实现类似这样的功能?

两种可能的解决方案。我没有编译任何这段代码,但如果出于某种原因它没有编译,它应该非常接近工作状态

一,

钩住CellEnter事件并将单元格的ReadOnly属性设置为您当时的CanbeEded属性。例如:

void dataGrid_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    var obj = dataGrid.Rows[e.RowIndex].DataBoundItem;
    dataGrid.CurrentRow.Cells[e.ColumnIndex].ReadOnly = !obj.CanBeEdited;
}
二,

如果由于某种原因,这不起作用,那么您唯一的其他选项将是在加载数据后循环遍历所有行和列,并以这种方式设置ReadOnly属性。您可以在datagrid的DataBindingComplete事件中运行此代码。但是,如果您的数据发生了很大的变化,那么这段代码效率不高,因此可能会减慢速度。如果您的数据只加载一次,那么这段代码应该可以正常工作

foreach (DataGridViewRow row in dataGrid.Rows)
{
    if ((row.Index == -1) || (e.RowIndex == dataGrid.NewRowIndex))
    {
        continue; // disregard row headers and also the new row
    }

    var obj = row.DataBoundItem;

    foreach (DataGridViewColumn col in row.Cells)
    {
         if (col.Index == -1)
         {
              continue; // disregard column headers
         }

         col.ReadOnly = !obj.CanBeEdited
    }
}

请尝试在网格CellEnter事件处理程序中设置row.Cells[MyCell].ReadOnly:您将在某人开始之前启用或禁用编辑editing@ASh我为用户提供弹出窗口以填充每个元素的注释,其工作方式与dgv中的foreachrow类似。SelectedRows{ifrow.Cells[comment]。ReadOnly{continue;}…}cell.ReadOnly启用/禁用该单元格的编辑。我不明白你为什么还需要它来做其他事情。至于您的代码片段:dgv中的foreachDataGridViewRow行。SelectedRows{MyObject obj=row.DataBoundItem作为MyObject;if!obj.canbeedid{continue;}…}probably@Vyktor您是否试图根据DataBoundItem中的.canbeedid属性将某些行设置为只读?@jaredbaszler某些单元格,是的。