Как определить значение ячейки изменилось datagridview c # - PullRequest
4 голосов
/ 07 марта 2012

Похоже, нет однозначного ответа на подобные вопросы по SOF.

У меня есть DataGridView, который связан с BindingList<T> объектом (который представляет собой список пользовательских объектов; также наследует INotifyPropertyChanged). Каждый из пользовательских объектов имеет уникальный таймер. Когда эти таймеры передают определенное значение (скажем, 10 секунд), я хочу изменить цвет переднего плана на красный.

Я использую событие CellValueChanged, но это событие, похоже, никогда не срабатывает, хотя я вижу изменение таймера на DataGridView. Есть ли другое событие, которое я должен искать? Ниже мой CellValueChanged обработчик.

private void checkTimerThreshold(object sender, DataGridViewCellEventArgs e)
    {
        TimeSpan ts = new TimeSpan(0,0,10);
        if (e.ColumnIndex < 0 || e.RowIndex < 0)
            return;
        if (orderObjectMapping[dataGridView1["OrderID", e.RowIndex].Value.ToString()].getElapsedStatusTime().CompareTo(ts) > 0)
        {
            DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
            cellStyle.ForeColor = Color.Red;
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style = cellStyle;
        }
    }

1 Ответ

3 голосов
/ 07 марта 2012

Я не знаю, как это заставить DataGridView вызывать событие, когда его DataSource изменен программным образом - это сделано специально.

Лучший способ удовлетворить ваши требования - представитьa BindingSource в микс - источники привязки вызывают события, когда их DataSource изменяется.

Нечто подобное работает (вам, очевидно, нужно будет настроить его под свои нужды):

bindingSource1.DataSource = tbData;
dataGridView1.DataSource = bindingSource1;
bindingSource1.ListChanged += new ListChangedEventHandler(bindingSource1_ListChanged); 

public void bindingSource1_ListChanged(object sender, ListChangedEventArgs e)
{
    DataGridViewCellStyle cellStyle = new DataGridViewCellStyle(); 
    cellStyle.ForeColor = Color.Red;

    dataGridView1.Rows[e.NewIndex].Cells[e.PropertyDescriptor.Name].Style = cellStyle;
}

Другоевозможность сделать это, подписавшись непосредственно на данные - если это BindingList, он распространит события NotifyPropertyChanged, используя свое собственное событие ListChanged.В более сценарии MVVM, который, возможно, будет чище, но в WinForms BindingSource, вероятно, лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...