C# 拖放Datagrid视图Winform C的行

C# 拖放Datagrid视图Winform C的行,c#,datagridview,C#,Datagridview,我想在同一网格视图中将行从某个位置拖到另一个位置。其他行应根据拖放自动调整 谢谢在应用程序中进行d&d时,我更喜欢使用鼠标事件,而不是实际的拖放事件 1-未绑定示例 下面是一个简单的示例,它使用鼠标事件在标签中放置一个单元格值时拖动行 它将在放置行之后插入该行 dragLabel部件是可选的 首先,我们在类级别声明两个helper变量: int dragRow = -1; Label dragLabel = null; 然后我们对CellMouseDown进行编码以准备标签..: 真正的工作在

我想在同一网格视图中将行从某个位置拖到另一个位置。其他行应根据拖放自动调整


谢谢

在应用程序中进行d&d时,我更喜欢使用鼠标事件,而不是实际的拖放事件

1-未绑定示例

下面是一个简单的示例,它使用鼠标事件在标签中放置一个单元格值时拖动行

它将在放置行之后插入该行

dragLabel部件是可选的

首先,我们在类级别声明两个helper变量:

int dragRow = -1;
Label dragLabel = null;
然后我们对CellMouseDown进行编码以准备标签..:

真正的工作在鼠标上。我们需要一个测试来找出我们在哪一排(如果有的话)。我们还需要根据拖动方向计算目标行

最后我们清理了标签

请注意:

确保没有行是新的或修改的,或者不能移动它。我花了一段时间才意识到,在最初添加行之前,我必须关闭AllowUserToAddress

选择的处理方式由您决定。如果拖放失败,我选择选择拖动的行。我选择让它在拖动到空白处时失败

更新:

2-数据绑定示例

如果DGV是数据绑定的,则不能直接移动行。相反,您需要移动数据源中的行

假设您有一个DataTable DT。然后可以从中删除行,并在任意位置插入行。与SQL DBMS表完全不同

请注意,数据行一旦从数据表中删除,就会丢失其值。因此,我们需要在删除行之前克隆这些值。除此之外,代码基本相同。只需将最内部的条件替换为:

if (tgtRow != dragRow)
{
    DataRow dtRow = DT.Rows[dragRow];
    DataRow newRow = DT.NewRow();
    newRow.ItemArray = DT.Rows[dragRow].ItemArray; // we need to clone the values

    DT.Rows.Remove(dtRow);
    DT.Rows.InsertAt(newRow, tgtRow);
    dataGridView1.Refresh();
    dataGridView1.Rows[tgtRow].Selected = true;
}

在应用程序中进行d&d时,我更喜欢使用鼠标事件,而不是实际的拖放事件

1-未绑定示例

下面是一个简单的示例,它使用鼠标事件在标签中放置一个单元格值时拖动行

它将在放置行之后插入该行

dragLabel部件是可选的

首先,我们在类级别声明两个helper变量:

int dragRow = -1;
Label dragLabel = null;
然后我们对CellMouseDown进行编码以准备标签..:

真正的工作在鼠标上。我们需要一个测试来找出我们在哪一排(如果有的话)。我们还需要根据拖动方向计算目标行

最后我们清理了标签

请注意:

确保没有行是新的或修改的,或者不能移动它。我花了一段时间才意识到,在最初添加行之前,我必须关闭AllowUserToAddress

选择的处理方式由您决定。如果拖放失败,我选择选择拖动的行。我选择让它在拖动到空白处时失败

更新:

2-数据绑定示例

如果DGV是数据绑定的,则不能直接移动行。相反,您需要移动数据源中的行

假设您有一个DataTable DT。然后可以从中删除行,并在任意位置插入行。与SQL DBMS表完全不同

请注意,数据行一旦从数据表中删除,就会丢失其值。因此,我们需要在删除行之前克隆这些值。除此之外,代码基本相同。只需将最内部的条件替换为:

if (tgtRow != dragRow)
{
    DataRow dtRow = DT.Rows[dragRow];
    DataRow newRow = DT.NewRow();
    newRow.ItemArray = DT.Rows[dragRow].ItemArray; // we need to clone the values

    DT.Rows.Remove(dtRow);
    DT.Rows.InsertAt(newRow, tgtRow);
    dataGridView1.Refresh();
    dataGridView1.Rows[tgtRow].Selected = true;
}

到目前为止你试过什么?请记住,堆栈溢出不是人们为您编写代码的地方!请。已尝试dragdrop事件,但不适用于我。请同时发布代码以显示您已尝试的内容。这让那些愿意帮助你的人的生活变得更轻松。到目前为止你做了哪些尝试?请记住,堆栈溢出不是人们为您编写代码的地方!请。已尝试dragdrop事件,但不适用于我。请同时发布代码以显示您已尝试的内容。这使愿意帮助您的人的生活更轻松。当控件为数据绑定时,无法通过编程方式将获取此错误行添加到DataGridView的行集合。啊,没错。你应该在问题中提到这一点。稍后我将修改答案..获取此错误时,如果控件是数据绑定的,则无法以编程方式将行添加到DataGridView的行集合中。啊,没错。你应该在问题中提到这一点。我一会儿就修改答案。。
if (tgtRow != dragRow)
{
    DataRow dtRow = DT.Rows[dragRow];
    DataRow newRow = DT.NewRow();
    newRow.ItemArray = DT.Rows[dragRow].ItemArray; // we need to clone the values

    DT.Rows.Remove(dtRow);
    DT.Rows.InsertAt(newRow, tgtRow);
    dataGridView1.Refresh();
    dataGridView1.Rows[tgtRow].Selected = true;
}