您的位置:

DataGridView选中行:

一、DataGridView选中行数据不更新

在使用DataGridView显示数据时,如果在某个单元格中修改了内容,再选中其他行,会发现之前修改的单元格中的内容并没有更新。出现这种情况的原因是因为DataGridView默认启用了InEditMode属性。当选中一个单元格,这个单元格成为活动单元格,会自动进入编辑模式。只有在编辑模式下修改的内容才会实时更新到绑定的数据源中。在非编辑模式下,DataGridView绑定的数据源不会自动更新。

解决方法:取消DataGridView的InEditMode属性

dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;

二、DataGridView选中行右键菜单

在DataGridView中添加右键菜单能够方便地对选中的行进行一些操作,比如删除、复制等。

实现步骤:

1、添加一个ContextMenuStrip控件。

2、双击ContextMenuStrip控件,在事件处理程序中添加需要执行的代码。

3、将DataGridView的ContextMenuStrip属性设为新添加的ContextMenuStrip控件。

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        contextMenuStrip1.Show(dataGridView1, e.X, e.Y);
    }
}

private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.SelectedRows)
    {
        dataGridView1.Rows.Remove(row);
    }
}

三、DataGridView选中行数

通过以下代码可以获取DataGridView选中行的数量。

int selectedRows = dataGridView1.SelectedRows.Count;

四、DataGridView选中行颜色

在默认情况下,DataGridView选中行的背景色为蓝色。我们可以通过以下代码更改选中行的背景色和前景色。

dataGridView1.DefaultCellStyle.SelectionBackColor = Color.Yellow;
dataGridView1.DefaultCellStyle.SelectionForeColor = Color.Black;

五、DataGridView选中行数据

可通过以下代码获取选中行的数据。

if (dataGridView1.SelectedRows.Count > 0)
{
    DataGridViewRow selectedRow = dataGridView1.SelectedRows[0];
    string value1 = selectedRow.Cells[0].Value.ToString();
    string value2 = selectedRow.Cells[1].Value.ToString();
    // ...
}

六、DataGridView合并列

有时我们需要将DataGridView中的相邻多个单元格合并成一列,可以通过CellPainting事件来实现。

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex == -1 && e.ColumnIndex == 1)
    {
        e.PaintBackground(e.CellBounds, true);
        e.Graphics.DrawString("合并列的名称", e.CellStyle.Font, Brushes.Black, e.CellBounds.X + 2, e.CellBounds.Y + 5);
        e.Handled = true;
    }
    else if (e.RowIndex >= 0 && e.ColumnIndex == 1)
    {
        DataGridViewCell cell1 = dataGridView1.Rows[e.RowIndex].Cells[1];
        DataGridViewCell cell2 = dataGridView1.Rows[e.RowIndex].Cells[2];
        cell1.Value = cell1.Value.ToString() + "\r\n" + cell2.Value.ToString();
        cell2.Style.BackColor = Color.Gray;
        cell2.Value = "";
        e.Handled = true;
    }
}

七、DataGridView选中行不跟随

DataGridView默认情况下,选中行会跟随鼠标移动。如果不想让选中行跟随鼠标移动,可以通过以下代码实现。

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.RowHeadersVisible = false;
dataGridView1.ScrollBars = ScrollBars.None;

private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        dataGridView1.Rows[e.RowIndex].Selected = true;
    }
}

private void dataGridView1_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        dataGridView1.Rows[e.RowIndex].Selected = false;
    }
}

八、DataGridView选中行的行号

在DataGridView中,默认情况下不显示行号。如果需要获取选中行的行号,可以通过以下代码实现。

if (dataGridView1.SelectedRows.Count > 0)
{
    int rowIndex = dataGridView1.SelectedRows[0].Index;
    // ...
}

九、DataGridView选中行复制单元格

我们可以通过以下代码实现DataGridView的选中行单元格内容的复制。

private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
    Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
}

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.C)
    {
        Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
        e.Handled = true;
    }
}