将当前单元格选择更改为行选择

本文关键字:选择 行选 单元格 | 更新日期: 2023-09-27 17:52:33

我有一个windows窗体,其中我们有一个DataGridView。它的属性是单元格选择,我有一个ContextMenustrip,其中有一个名为select all的菜单,当单击select all时,它应该将所选单元格的DataGridView的属性更改为FullRowSelect,并且选择应该在我单击的同一行。问题是当我点击一个细胞的默认属性是细胞选择当我点击选择所有的ContextMenustrip选中的单元格不选择和我有重新选择这一行,当形式打开,当我点击特定的细胞,当我点击选择所有然后单击ContextMenustrip相同的行被选中,我应该点击细胞之前这是我代码。

private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}

将当前单元格选择更改为行选择

如果我正确理解了你的问题,那么当单击上下文菜单的" select All"选项时,您希望选择整个行。如果这是正确的,您可以尝试:

dataGridView1.SelectedCells[0].OwningRow.Selected = true;

foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
    cell.OwningRow.Selected = true;

您需要先删除以下行:

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

上面一行将把DataGridView置于全行选择模式,在这种模式下,SelectedCells属性将不会被使用,然后当您单击上下文菜单中的select All选项时,您将看到以下例外。

Index was out of range. Must be non-negative and less than the size of the collection.

整个函数应该是这样的:

private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
        cell.OwningRow.Selected = true;
}

注意,用户需要(左)单击他们想要选择的行所在的单元格,然后右击以弹出上下文菜单。否则,选择将不会改变,并且将选择先前选择的单元格的行。

在更改选择模式之前选取选定的单元格,并在更改选择模式后选择这些单元格的行:

var selectedCells = dataGridView1.SelectedCells;            
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
foreach (DataGridViewCell cell in selectedCells)            
    dataGridView1.Rows[cell.RowIndex].Selected = true;

你为什么要那样做?因为DataGridView控件清除选择时,它的选择模式的变化。参见msnd:

对SelectionMode属性的注释

改变SelectionMode属性的值将清除当前选择。

   private void employeesDataGridView_MouseUp(object sender, MouseEventArgs e)
    {
        DataGridView.HitTestInfo hitTestInfo;
        if (e.Button == MouseButtons.Right)
        {
            hitTestInfo = employeesDataGridView.HitTest(e.X, e.Y);
            if (hitTestInfo.Type == DataGridViewHitTestType.RowHeader || hitTestInfo.Type == DataGridViewHitTestType.Cell)
            {
                if (hitTestInfo.ColumnIndex != -1)
                    employeesDataGridView.CurrentCell = employeesDataGridView[hitTestInfo.ColumnIndex, hitTestInfo.RowIndex];
                contextMenuStrip1.Show(employeesDataGridView, employeesDataGridView.PointToClient(System.Windows.Forms.Cursor.Position));
            }
        }       
    }
    private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
    {
        employeesDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        var current = employeesDataGridView.CurrentCell;
        if (current == null) return;
        if (current.ColumnIndex == -1)
            return;
        if (current.RowIndex == -1)
            return;
        employeesDataGridView[current.ColumnIndex, current.RowIndex].Selected = true;
    }
    private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
    {
        employeesDataGridView.SelectionMode = DataGridViewSelectionMode.CellSelect;
    }