在DataGridView中启用ColumnHeader,RowHeader和单元格的选择

时间:2019-12-19 08:58:20

标签: c# .net winforms datagridview

我正在尝试在DataGridView中实现类似excel的功能。因此:

  1. 如果他们选择列标题,则会选择列
  2. 如果用户选择行标题,则将选择整行
  3. 除此以外,如果他们选择单元格,则只会选择单个单元格。

因此,对于第三个要求,我将SelectionMode设为CellSelect。对于列选择,我选择了列中的所有单元格,但是当我尝试打印SelectedColumns时,它打印为零。看来我也必须选择列标题。我不知道如何以编程方式选择列标题。所需的代码如下。有人可以告诉我如何实现吗?

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

3 个答案:

答案 0 :(得分:3)

作为一个选项,您可以将SelectionMode设置为CellSelect,然后处理CellClick并针对单击的单元格的行索引和列索引进行选择,然后选择该单元格或完整单元格行或整列或使用代码的所有单元格。

由于选择模式为CellSelect,因此所选列或所选行为空,并且由于任何原因要跟踪所选列或所选行,则需要手动进行跟踪。

对于选择的视觉反馈同样如此,您需要设置标题的颜色或自己绘制。例如:

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

enter image description here

答案 1 :(得分:0)

也许您可以尝试遍历DataGridView并检查是否选择了列中的所有单元格。然后定义一个List来存储这些过滤的列。

List<DataGridViewColumn> selectedcolumns = new List<DataGridViewColumn>();

private void button1_Click(object sender, EventArgs e)
{
    bool flag = true;
    selectedcolumns.Clear();

    foreach (DataGridViewColumn column in dataGridView1.Columns)
    {
        for (int i = 0; i < dataGridView1.RowCount; i++)
        {
            if (dataGridView1.Rows[i].Cells[column.Index].Selected == false)
            {
                flag = false;
                break;
            }
        }
        if (flag)
            selectedcolumns.Add(column);
        flag = true;
    }

    foreach (DataGridViewColumn c in selectedcolumns)
        Console.WriteLine(c.Index);
}

答案 2 :(得分:0)

作为另一个选项,您可以处理OnCellMouseDown事件,并根据单击的单元格决定设置SelectionMode。这样,您可以获得视觉反馈以及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;
    }
}

enter image description here