0

我有一个 Windows 窗体,其中我们有一个DataGridView. 它的属性是单元格选择,我有ContextMenustrip一个菜单,其中有一个名为全选的菜单,当单击全选时,它应该DataGridView将所选单元格的属性更改为,FullRowSelect并且选择应该在我单击的同一行上. 问题是当我单击一个单元格时,默认属性是单元格选择,当我单击选择时,所有ContextMenustrip选定的单元格都没有被选中,我必须重新选择我想要的行,当表单打开时,当我单击时在特定单元格上,当我单击选择所有ContextMenustrip被单击时,应该选择我之前单击单元格的同一行,这是我的代码。

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

3 回答 3

3

如果我正确阅读了您的问题,您希望在单击上下文菜单的“全选”选项时选择整行。如果这是正确的,您可以尝试:

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

请注意,在右键单击以调出上下文菜单之前,用户需要(左)单击要选择其行的单元格。否则,选择不会改变,并且之前选择的单元格的行将被选中。

于 2013-01-13T11:06:18.423 回答
1

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

var selectedCells = dataGridView1.SelectedCells;            
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

foreach (DataGridViewCell cell in selectedCells)            
    dataGridView1.Rows[cell.RowIndex].Selected = true;

为什么你必须这样做?因为DataGridView控制清除选择模式更改时的选择。请参阅msnd中有关SelectionMode属性的备注:

更改 SelectionMode 属性的值会清除当前选择。

于 2013-01-13T11:24:12.190 回答
1
   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;
    }
于 2013-01-13T11:32:36.340 回答