我根据存储的值DataGridViewCell
设置了DataGridViewRow.DataBoundItem
的一些属性,例如:
DataGridViewRow row;
MyObject obj = row.DataBoundItem as MyObject;
row.Cells["MyCell"].ReadOnly = !obj.CanBeEdited;
现在我滥用 RowPrePaint
事件来设置它们,但问题是数据网格中显示的对象是从另一个线程更改的,我需要这些属性设置正确无需重绘(例如选择多个行屏幕并编辑多个值)。
问:将属性DataBoundItems绑定到Cell属性的正确方法是什么?
是否有某些方法(例如DataGridView.InvalidateRow
)会实现这样的 这样的功能?
答案 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
}
}