Я использую DGV для показа списка изображений с текстовыми подписями как picklist. Их должен всегда быть один и только один выбор, сделанный в списке. Я не могу найти способ препятствовать тому, чтобы пользователь очистил выбор щелчком управления по выбранной строке.
Существует ли свойство в разработчике, которого я скучаю, который мог сделать это?
Если я должен переопределить поведение в событиях нажатия мыши, там другие способы, которыми пользователь мог очистить текущий выбор та потребность, покрытая также?
Существует ли третий подход, который я мог проявить, это является менее громоздким, чем моя вторая идея?
Самый простой способ - перехватить событие SelectionChanged
и проверить, не снял ли пользователь выделение со всех строк. Если это так, повторно выберите ранее выбранную строку. По сути, вы перехватываете их действие и переключаете выбор обратно.Примерно так (код не тестировался, но вы поймете идею):
DataGridViewRow last_selected_row;
private void dgv_SelectionChanged(object sender, EventArgs e)
{
if (dgv.SelectedRows.Count == 0)
last_selected_row.Selected = true;
else
last_selected_row = dgv.SelectedRows[0];
}
В зависимости от вашего приложения, может быть лучше сохранить индекс строки, а не ссылку на саму строку. Также не забудьте инициализировать last_selected_row и обновить его, если вы удалите какие-либо строки.
Любые другие элементы управления, которые перехватывают событие SelectionChanged
, должны будут безопасно обрабатывать случай, когда не выбраны никакие строки, в случае, если они срабатывают до события, которое переключает их обратно. Однако они могут просто вернуться немедленно, зная, что SelectionChanged
мгновенно сработает снова.
Вы также можете создать подкласс DataGridView
и переопределить метод OnSelectionChanged
. Затем вы можете повторно выбрать последнюю выбранную строку перед срабатыванием события (оно сработает при вызове base.OnSelectionChanged
).
У DGV есть свойство, называемое множественным выбором, если вы установите для него значение false, одновременно можно выбрать только одну ячейку / строку.