简体   繁体   English

在 DataGridView 中通过 ColumnHeader、RowHeader 和 Cell 启用选择

[英]Enable selection by ColumnHeader, RowHeader and Cell in DataGridView

I am trying to implement excel like feature in DataGridView .我正在尝试在DataGridView实现类似 excel 的功能。 So:所以:

  1. if they select column header it would select the column如果他们选择列标题,它将选择该列
  2. if the user selects row header then entire row would be selected如果用户选择行标题,则将选择整行
  3. Apart from this if they select cell, only that single cell would be selected.除此之外,如果他们选择单元格,则只会选择该单个单元格。

To so so, for the third requirement I made the SelectionMode as CellSelect .为此,对于第三个要求,我将SelectionMode设为CellSelect For a column selection I selected all the cells in a column , but when I tried to print SelectedColumns , it printed as zero.对于列选择,我选择了列中的所有单元格,但是当我尝试打印SelectedColumns ,它打印为零。 It seems I have to select the column headers also.看来我还必须选择列标题。 I don't know how to select column header programmatically.我不知道如何以编程方式选择列标题。 The required code is below.所需的代码如下。 Can anybody tell me how to achieve this?谁能告诉我如何实现这一目标?

private void dataGridViewFileData_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
    dataGridViewFileData.MultiSelect = true;
    dataGridViewFileData.SelectionMode = DataGridViewSelectionMode.CellSelect;
    for (int i = 0; i < dataGridViewFileData.Rows.Count; ++i)
         dataGridViewFileData.Rows[i].Cells[0].Selected = true;
    MessageBox.Show("Selected columns:" + dataGridViewFileData.SelectedColumns.Count.ToString());
}

As an option you can set the SelectionMode to CellSelect , then handle the CellClick and regarding to the row index and column index of the clicked cell and select the cell, or full row or full column or all cells using code.作为一个选项,您可以将SelectionMode设置为CellSelect ,然后处理CellClick以及关于单击单元格的行索引和列索引,并使用代码选择单元格,或整行或整列或所有单元格。

Since the selection mode is CellSelect , selected columns or selected rows are empty and if for any reason you want to track selected column or selected row, you need to track it manually.由于选择模式是CellSelect ,选定的列或选定的行是空的,如果出于任何原因要跟踪选定的列或选定的行,则需要手动跟踪它。

The same for visual feedback about the selection, you need to set back color of the headers or paint them yourself.对于有关选择的视觉反馈,您需要设置标题的背景颜色或自己绘制它们。 For example:例如:

private async void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.ColumnCount = 3;
    dataGridView1.RowCount = 3;
    dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
    dataGridView1.CellClick += DataGridView1_CellClick;
    dataGridView1.EnableHeadersVisualStyles = false;
}
DataGridViewColumn selectedColumn = null;
DataGridViewRow selectedRow = null;
List<DataGridViewCell> selectedCells = null;
private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.ClearSelection();

    if (selectedColumn != null)
        selectedColumn.HeaderCell.Style.BackColor =
            dataGridView1.ColumnHeadersDefaultCellStyle.BackColor;
    if (selectedRow != null)
        selectedRow.HeaderCell.Style.BackColor =
            dataGridView1.RowHeadersDefaultCellStyle.BackColor;

    selectedColumn = null;
    selectedRow = null;
    selectedCells = null;
    if (e.ColumnIndex == -1 && e.RowIndex == -1)
    {
        dataGridView1.SelectAll();
        selectedCells = new List<DataGridViewCell>();
        foreach (DataGridViewRow row in dataGridView1.Rows)
            selectedCells.AddRange(row.Cells.Cast<DataGridViewCell>());
    }
    else if (e.ColumnIndex == -1 && e.RowIndex > -1)
    {
        selectedRow = dataGridView1.Rows[e.RowIndex];
        foreach (DataGridViewCell cell in dataGridView1.Rows[e.RowIndex].Cells)
            cell.Selected = true;
    }
    else if (e.ColumnIndex > -1 && e.RowIndex == -1)
    {
        selectedColumn = dataGridView1.Columns[e.ColumnIndex];
        foreach (DataGridViewRow row in dataGridView1.Rows)
            row.Cells[e.ColumnIndex].Selected = true;
    }
    else
    {
        selectedCells = selectedCells = new List<DataGridViewCell>()
            { dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] };
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
    }
    if (selectedColumn != null)
        selectedColumn.HeaderCell.Style.BackColor = SystemColors.Highlight;
    if (selectedRow != null)
        selectedRow.HeaderCell.Style.BackColor = SystemColors.Highlight;
}

在此处输入图片说明

As another option you can handle OnCellMouseDown event and depending to the clicked cell, decide to set SelectionMode .作为另一种选择,您可以处理OnCellMouseDown事件,并根据单击的单元格决定设置SelectionMode This way, you can get the visual feedback as well as SelectedColumns and SelectedRows :这样,您可以获得视觉反馈以及SelectedColumnsSelectedRows

private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.ColumnCount = 3;
    dataGridView1.RowCount = 3;
    foreach (DataGridViewColumn c in dataGridView1.Columns)
        c.SortMode = DataGridViewColumnSortMode.NotSortable;
    dataGridView1.CellMouseDown += DataGridView1_CellMouseDown;
}
private void DataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    dataGridView1.ClearSelection();
    if (e.ColumnIndex == -1 && e.RowIndex == -1)
    {
        dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
        dataGridView1.SelectAll();
    }
    else if (e.ColumnIndex == -1 && e.RowIndex > -1)
    {
        dataGridView1.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
        dataGridView1.Rows[e.RowIndex].Selected = true;
    }
    else if (e.ColumnIndex > -1 && e.RowIndex == -1)
    {
        dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
        dataGridView1.Columns[e.ColumnIndex].Selected = true;
    }
    else
    {
        dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
    }
}

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM