2015-07-01 3 views
0

Я устанавливаю некоторые свойства DataGridViewCell на основе значений, хранящихся DataGridViewRow.DataBoundItem, например:свойство Binding клеток к DataBoundItem

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

Прямо сейчас я злоупотребляяRowPrePaint события, чтобы установить эти вверх, но проблема что объекты, отображаемые в datagrid, меняются из другого потока, и мне нужны эти свойства, заданные правильно, без перерисовки (например, выбор нескольких экранов строк и редактирование нескольких значений).

Вопрос: Каков надлежащий способ привязки свойств DataBoundItems к свойствам Cell?

Есть ли способ (например, DataGridView.InvalidateRow), где функциональность должна быть реализована??

+0

попробуйте установить 'row.Cells [«MyCell»] ReadOnly' в сетке' обработчик события CellEnter':. Вы включить или отключить редактирование только, прежде чем кто начал редактировать – ASh

+0

@ASh я обеспечиваю всплывал для пользователя в заполнить комментарий к каждому элементу и работать как 'foreach (строка в dgv.SelectedRows) {if (row.Cells [" Comment "]. ReadOnly) {продолжить;} ...}' – Vyktor

+0

cell.ReadOnly включает/отключает редактирование для этого клетка. я не понимаю, зачем это нужно для чего-то другого. как для вашего фрагмента: 'foreach (строка DataGridViewRow в dgv.SelectedRows) {MyObject obj = row.DataBoundItem как MyObject; if (! obj.CanBeEdited) {continue;} ...} 'возможно – ASh

ответ

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 вашего datagrid. Но, если ваши данные сильно изменятся, этот код неэффективен, что может замедлить работу. Если ваши данные загружаются только один раз, этот фрагмент кода должен работать нормально для вас.

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 
    } 
} 
Смежные вопросы