DataGridView, который всегда имеет одну выбранную строку
Я использую DGV для отображения списка изображений с текстовыми подписями в качестве раскрывающегося списка. Их всегда должен быть один и только один выбор в списке. Я не могу найти способ помешать пользователю очистить выделение с помощью control-click на выбранной строке.
есть ли свойство в дизайнере, которого мне не хватает, которое могло бы это сделать?
Если мне нужно переопределить поведение в событиях щелчка мыши, есть ли другие способы, которыми пользователь может очистить текущий выбор что нужно также?
есть ли третий подход, который я мог бы принять, который менее громоздкий, чем моя вторая идея?
3 ответов
самый простой способ-поймать 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 получил свойство multiselect, если вы установите его в false, можно выбрать только одну ячейку/строку за раз.
просто обработайте событие DataBindingComplete datagridview следующим образом:
private void datagridview1_DataBindingComplete(System.Object sender, System.Windows.Forms.DataGridViewBindingCompleteEventArgs e)
{
datagridview1.ClearSelection();
}