Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DataGridView中启用按ColumnHeader、RowHeader和单元格进行选择_C#_.net_Winforms_Datagridview - Fatal编程技术网

C# 在DataGridView中启用按ColumnHeader、RowHeader和单元格进行选择

C# 在DataGridView中启用按ColumnHeader、RowHeader和单元格进行选择,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我正在尝试在DataGridView中实现类似excel的功能。因此: 如果他们选择列标题,它将选择列 如果用户选择行标题,则将选择整行 除此之外,如果他们选择单元格,则只会选择单个单元格。 因此,对于第三个需求,我将SelectionMode设置为CellSelect。对于列选择,我选择了列中的所有单元格,但当我尝试打印SelectedColumns时,它打印为零。似乎我还必须选择列标题。我不知道如何以编程方式选择列标题。所需代码如下。有人能告诉我如何做到这一点吗 private void d

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

如果他们选择列标题,它将选择列 如果用户选择行标题,则将选择整行 除此之外,如果他们选择单元格,则只会选择单个单元格。 因此,对于第三个需求,我将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());
}

作为一个选项,您可以将设置为,然后处理与所单击单元格的行索引和列索引相关的和,并使用代码选择该单元格、或整行、整列或所有单元格

由于选择模式为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;
}

作为一个选项,您可以将设置为,然后处理与所单击单元格的行索引和列索引相关的和,并使用代码选择该单元格、或整行、整列或所有单元格

由于选择模式为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;
}

作为另一个选项,您可以处理事件,并根据单击的单元格决定设置。通过这种方式,您可以获得视觉反馈以及SelectedColumns和SelectedRows:


作为另一个选项,您可以处理事件,并根据单击的单元格决定设置。通过这种方式,您可以获得视觉反馈以及SelectedColumns和SelectedRows:


您的代码也不会选择columnheader或rowheader。因为它们的索引是-1。你的代码没有处理这种情况。这是我必须处理的特定条件。显然,选定的列或选定的行是空的,因为选择模式是CellSelect。如果我选择列中的所有单元格,那么它将不是列选择。因此,选定列计数必须为1。您使用的是DataGridView,选定列与选定列的所有单元格不同。但是,您可以将单击的列索引/单击的行索引保留在变量中。问题是另一个函数根据selectedcolumns.count删除选定的多列。我必须直观地显示所选列。您的代码也不会选择columnheader或rowheader。因为它们的索引是-1。你的代码没有处理这种情况。这是我必须处理的特定条件。显然,选定的列或选定的行是空的,因为选择模式是CellSelect。如果我选择列中的所有单元格,那么它将不是列选择。因此,选定列计数必须为1。您使用的是DataGridView,选定列与选定列的所有单元格不同。但是,您可以将单击的列索引/单击的行索引保留在变量中。问题是另一个函数根据selectedcolumns.count删除选定的多列。我必须直观地显示所选列。我也喜欢这个选项,可能更喜欢它。试试看,或者看看屏幕截图,让我知道你的反馈。我也喜欢这个选项,也许更喜欢。试试看,或者看看屏幕截图,让我知道你的反馈。