将单元属性绑定到DataBoundItem

时间:2015-07-01 08:49:04

标签: c# .net winforms datagridview

我根据存储的值DataGridViewCell设置了DataGridViewRow.DataBoundItem的一些属性,例如:

DataGridViewRow row;
MyObject obj = row.DataBoundItem as MyObject;
row.Cells["MyCell"].ReadOnly = !obj.CanBeEdited;

现在我滥用 RowPrePaint事件来设置它们,但问题是数据网格中显示的对象是从另一个线程更改的,我需要这些属性设置正确无需重绘(例如选择多个行屏幕并编辑多个值)。

问:将属性DataBoundItems绑定到Cell属性的正确方法是什么?

是否有某些方法(例如DataGridView.InvalidateRow)会实现这样的 这样的功能?

1 个答案:

答案 0 :(得分:0)

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

<强>#1

挂钩CellEnter事件并将当前单元格的ReadOnly属性设置为CanBeEdited属性。如:

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

<强>#2

如果由于某种原因无效,您的唯一选择是在加载数据后循环遍历所有行和列,并以此方式设置ReadOnly属性。您可以在数据网格的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
    }
}