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();
}