Выберите несколько строк без нажатия клавиши управления - PullRequest
3 голосов
/ 12 октября 2010

У меня есть вид сетки, где я могу выбрать несколько строк, нажав клавишу управления.Можно ли добиться того же самого без нажатия клавиши управления.

Ответы [ 5 ]

5 голосов
/ 12 октября 2010

Поскольку действие .net по умолчанию также обновит slectedrows вашего datagridview, вам необходим массив для резервирования старых выборов:

DataGridViewRow[] old; 

, который будет обновлен на CellMouseDown (перед действием .net по умолчанию измените ваш выбор):

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    old = new DataGridViewRow[dataGridView1.SelectedRows.Count];
    dataGridView1.SelectedRows.CopyTo(old,0);  
}

после этого вы можете внести изменения в RowHeaderMouseClick (так как RowHeaderSelect является сетевым представлением по умолчанию selectionmode) или использовать CellMouseClick для FullRowSelect и повторно выбрать эти старые выбранные строки:

private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{    
    foreach (DataGridViewRow gr in old)
    {
        if (gr == dataGridView1.CurrentRow)
        {
            gr.Selected = false;
        }
        else
        {
            gr.Selected = true;
        }    
    }  
}

Редактировать: Лучшее решение:
Вам необходимо реализовать собственный datagridview, полученный из исходного, и переопределить OnCellMouseDown & OnCellMouseClick, чтобы отменить действие по умолчанию для отмены выбора и сделать его плавным. сделать новый класс как-то так:

Using System;
Using System.Windows.Forms;

public class myDataGridView:DataGridView
{
    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    {
        //base.OnCellMouseDown(e);
        this.Rows[e.RowIndex].Selected = !this.Rows[e.RowIndex].Selected;
    }

    protected override void OnCellMouseClick(DataGridViewCellMouseEventArgs e)
    {
        //base.OnCellMouseClick(e);
    }
}

и в вашем Form.Designer.cs измените DataGridView объект datagridview1 (если это имя) на myDataGridView объект ......

Например: изменить

private System.Windows.Forms.DataGridView dataGridView1; до

private myDataGridView dataGridView1;

и изменить

this.dataGridView1=new System.Windows.Forms.DataGridView() до

this.dataGridView1=new myDataGridView ()
1 голос
/ 12 октября 2010

Самым простым выходом может быть установка флажка в каждой строке и, возможно, флажка «выбрать все» в заголовке.

0 голосов
/ 27 января 2015

Мне пришлось сделать это для сенсорного экрана, где я хотел выбрать несколько элементов одним щелчком мыши, без уродливых флажков.Зачем это усложнять, просто не указывайте значения Index'es

    private List<int> SelectedIndexs { get; set; }

Затем добавляйте или удаляйте их из списка при нажатии на них ... Затем просматривайте свою сетку данных и выберите строки в списке.

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (SelectedIndexs.Contains(e.RowIndex))
        {
            SelectedIndexs.Remove(e.RowIndex);
        }
        else
        {
            SelectedIndexs.Add(e.RowIndex);
        }

        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            row.Selected = SelectedIndexs.Contains(row.Index);
        }
    }
0 голосов
/ 12 октября 2010

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

0 голосов
/ 12 октября 2010

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

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

...