DataGridView, у которого всегда выбрана одна строка - PullRequest
7 голосов
/ 16 марта 2010

Я использую DGV, чтобы показать список изображений с текстовыми надписями в качестве списка выбора. Их всегда должен быть один и только один выбор, сделанный в списке. Я не могу найти способ запретить пользователю очистить выделение с помощью управляющего щелчка на выбранной строке.

Есть ли в конструкторе отсутствующее свойство, которое могло бы это сделать?

Если мне нужно переопределить поведение в событиях щелчка мыши, есть ли другие способы, которыми пользователь мог бы очистить текущий выбор, который также должен быть покрыт?

Есть ли третий подход, который я мог бы использовать, который был бы менее громоздким, чем моя вторая идея?

Ответы [ 3 ]

2 голосов
/ 16 марта 2010

Самый простой способ - перехватить событие 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).

0 голосов
/ 10 апреля 2012

Просто обработайте событие DataBindingComplete для сетки данных следующим образом:

private void datagridview1_DataBindingComplete(System.Object sender, System.Windows.Forms.DataGridViewBindingCompleteEventArgs e)

{
datagridview1.ClearSelection();
}
0 голосов
/ 16 марта 2010

DGV получил свойство под названием multiselect, если вы установите его в false, только одна ячейка / строка может быть выбрана за раз.

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