2015-07-20 1 views
0

Короче говоря, точного эффекта, который я пытаюсь достичь, является то, что имеет следующий сценарий:Как многократно выбирать и отменить выбор строк в DataGridView?

У вас есть DataGridView с несколькими строками, а свойство DataGridView.MultiSelect имеет значение true.

Если вы удерживаете CTRL и нажимаете на строки, вы можете не только выбирать строки, но даже снимать выделение с уже выбранных - но вы не можете сделать это, не удерживая управление.

Как достичь аналогичного эффекта?

Когда я нажимаю на несколько строк DataGridView (отдельно), выбор DataGridView ведет себя так, как будто нажата кнопка CTRL.

Если это не представляется возможным (я видел его на другой проект :(), то как это может быть сделано, что DataGridViewRows выбираются на один щелчок, и если не выбран еще не выбран?

+0

Итак, вы хотите заставить пользователя отменять выбор строки за строкой, правильно? - А как насчет выбора Шилфта? Вы хотите это или нет? – TaW

+0

Я могу пойти на компромисс. –

+0

Ха, это говорит мне - ничего. Я хотел бы указать на проблему: когда вы выбираете shift-selection, вы можете легко выбрать много строк, но не сможете легко отменить выбор. – TaW

ответ

0

Вы можете использовать bool в событиях KeyDown и KeyUp (основной формы), чтобы проверить, нажата ли CTRL, и затем обрабатывать индексы строк из CellContentClick или любого другого из событий (который передает индекс строки и столбца, который может использоваться для установки свойство Selected). Просто выполните предложение if, которое проверяет, установлена ​​ли переменная bool переменной CTRL, а затем сделайте свой материал.

+0

+ Gnqz Я хочу, чтобы кнопка CTRL была нажата автоматически, без нажатия на нее. Таким образом, он создает эффект множественного выбора. Я не понимаю, как ваше решение может это достичь. –

+0

Что вы подразумеваете под «нажатием автоматически»? – Gnqz

+0

Я имею в виду код. CTRL всегда нажата, пока форма открыта. –

0

Вы можете попробовать это обходное решение без необходимости изменения/наследования DataGrid cont рол путем обработки предварительного просмотра мыши вниз события следующим образом:

TheDataGrid.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(TheDataGrid_PreviewMouseLeftButtonDown); 


void TheDataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    // get the DataGridRow at the clicked point 
    var o = TryFindFromPoint<DataGridRow>(TheDataGrid, e.GetPosition(TheDataGrid)); 
    // only handle this when Ctrl or Shift not pressed 
    ModifierKeys mods = Keyboard.PrimaryDevice.Modifiers; 
    if (o != null && ((int)(mods & ModifierKeys.Control) == 0 && (int)(mods & ModifierKeys.Shift) == 0)) 
    { 
     o.IsSelected = !o.IsSelected; 
     e.Handled = true; 
    } 
} 

Метод TryFindFromPoint является заимствованной функцией из этой ссылки http://www.hardcodet.net/2008/02/find-wpf-parent для того, чтобы получить экземпляр DataGridRow с точки вы щелкнули

Проверив ModifierKeys, вы можете по-прежнему держать Ctrl и Shift по умолчанию.

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

+0

Извините. Вероятно, я должен был упомянуть об этом проекте WinForms. –

+0

@Barry Я бы порекомендовал вам пройти через msdn для этой цели, поскольку у меня мало знаний о WinForms: https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.multiselect(v= vs.110) .aspx –