2013-08-22 2 views
1

У меня есть DataGridView с двумя столбцами флажков. Когда все строки на обоих из них отмечены, я хочу очистить галочки. Сетка заполняется из DataTable. Вот как это работает:Обновить значения ячейки DataGridView сразу

if (bothColumnsAreChecked) 
{ 
    DataRow first = SelectedFirstItems.First(); 
    DataRow second = SelectedSecondItems.First(); 

    // stuff... 

    first["IsCheckedFirst"] = false; 
    second["IsCheckedSecond"] = false; 
} 

Согласно this, я изменил код, чтобы уволить CellValueChanged событие сразу же после нажатия на флажок, не проигрывая фокус:

void brandsGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    brandsGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

Проблема заключается в том, что, после того, как очистка галочек, одна из строк по-прежнему выбрана (потому что я просто нажал на флажок в этой строке), и галочка в этой строке все еще видна - она ​​не исчезает, пока я не отменим выбор строки. Как мне это достичь? Я пробовал:

1) Refresh() на сетке. Безрезультатно; сетка обновляется, но не перерисовывается перед перемещением курсора.

2) CommitEdit() и EndEdit(). Это даже не очищает последний выбранный флажок.

Что я могу сделать?

EDIT: Я плохо объясняю. Вот простейшее пошаговое руководство:

Есть две колонки флажков: c1 и c2.

1) Я нажимаю c1 на строке r1. c1 становится проверенным, а r1 выбирается.

2) Я нажимаю c2 на строке r2 (или даже r1). c2 становится проверенным, а r2 выбирается.

3) c1 и c2 теперь очищаются (после регистрации информации о флажке где-то).

Проблема заключается в том, что, хотя chackmark исчезает из c1 в r1, он остается там, в флажке на r2, до тех пор, пока r2 не потеряет фокус.

Надеюсь, что это поможет.

+0

Я не понимаю. Выбор строк в datagridview и наличие галочек в некотором столбце (который, как я полагаю, вы из того, что вы написали), - это две разные вещи. Чего вы пытаетесь достичь? Выбор исчезнуть или что именно? – Tarec

+0

Когда я нажимаю флажок, выбирается строка с флажком. Выбор может исчезнуть или нет, это не важно. То, что я хочу сделать, - это перерисовать сетку после очистки флажков, так что флажков там нет. –

+0

@JohnNoCookies Я не понимаю, что вы подразумеваете под понятием checkbox? Вы рисуете его сами, и вы хотите его очистить? Или вы имеете в виду «снять отметку с флажка»? –

ответ

0

Сейчас немного яснее. Вы всегда можете отменить выбор строки в DGV, но я не знаю, если это то, что вы после

brandsGridView.ClearSelection(); 
+0

Это отменяет выбор строки, но галочка все еще существует. –

+0

Да, но я полагаю, что одна галочка отменяет выбор, а другая - не потому, что вторая строка все еще выбрана, поэтому вы можете просто попробовать выполнить очистку, прежде чем снимать флажки в указанном вами методе. – Tarec

0

Я думаю easies путь к первым установить обязательные для этого DataGridView как:

DataGridView dg = new DataGridView(); 
DataTable dt = GetDataTable(); 
dg.DataSource = dt; 

И затем, когда вы хотите обновить его, вы снова установите привязку. Да, я понимаю, что это грязный хакерский путь, но это самый простой.

DataTable dt = GetDataTable(); 
dg.DataSource = dt; 

Старый ответ: Я думаю, вы могли бы использовать BindingGroup для этого: http://msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup.aspx

+1

Похоже, что 'BindingGroup' - это какой-то материал WPF, а не' Winforms': P –

0

У меня была очень похожая проблема. (Ну, это другой контекст, но проблема была такая же)

После многих попыток и чтения этой и других связанных потоков я нашел решение. Это немного рудиментарно, но это работает для меня.

Проблема была связана с DataGridView с фокусом. Так что я на мгновение изменил фокус на другой элемент управления (кнопка, например), а затем привел его обратно в DataGridView

В вашем случае может быть, как это:

button1.focus(); 
if (bothColumnsAreChecked) 
{ 
    DataRow first = SelectedFirstItems.First(); 
    DataRow second = SelectedSecondItems.First(); 

    // stuff... 

    first["IsCheckedFirst"] = false; 
    second["IsCheckedSecond"] = false; 
} 
brandsGridView.focus(); 

Я надеюсь, что это может помочь. Но если кто-то найдет лучшее решение или более подробное объяснение, почему это происходит. Было бы весьма признательно.

Смежные вопросы