C# 拖放在C中不起作用#

C# 拖放在C中不起作用#,c#,winforms,drag-and-drop,C#,Winforms,Drag And Drop,我知道了如何从中拖动DataGridView之间的行,但现在我遇到了一个问题。我可以将该行从gridPODetails拖到DataGridView1。我可以将该行从DataGridView1拖回GridPodDetails。但在那之后我什么也得不到。我希望能够不确定地来回拖动,但我只能来回拖动。这可能是什么原因造成的?如何纠正 private void gridPODetails_MouseDown(object sender, MouseEventArgs e) {

我知道了如何从中拖动DataGridView之间的行,但现在我遇到了一个问题。我可以将该行从gridPODetails拖到DataGridView1。我可以将该行从DataGridView1拖回GridPodDetails。但在那之后我什么也得不到。我希望能够不确定地来回拖动,但我只能来回拖动。这可能是什么原因造成的?如何纠正

 private void gridPODetails_MouseDown(object sender, MouseEventArgs e)
        {
            DataGridView.HitTestInfo info = gridPODetails.HitTest(e.X, e.Y);

            if (info.RowIndex >= 0)
            {
                DataRow view = ((DataTable)(gridPODetails.DataSource)).Rows[info.RowIndex];
                if (view != null)
                {
                    gridPODetails.DoDragDrop(view, DragDropEffects.Copy);
                }
            }
        }

        private void gridPODetails_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void gridPODetails_DragDrop(object sender, DragEventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            DataTable table = grid.DataSource as DataTable;
            DataRow row = e.Data.GetData(typeof(DataRow)) as DataRow;

            if (row != null && table != null && row.Table != table)
            {
                table.ImportRow(row);
                row.Delete();
            }
        }

        private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);

            if (info.RowIndex >= 0)
            {
                DataRow view = ((DataTable)(dataGridView1.DataSource)).Rows[info.RowIndex];
                if (view != null)
                {
                    dataGridView1.DoDragDrop(view, DragDropEffects.Copy);
                }
            }
        }

        private void dataGridView1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void dataGridView1_DragDrop(object sender, DragEventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            DataTable table = grid.DataSource as DataTable;
            DataRow row = e.Data.GetData(typeof(DataRow)) as DataRow;

            if (row != null && table != null && row.Table != table)
            {
                table.ImportRow(row);
                row.Delete();
            }
        }

row.Delete()
之后添加
table.AcceptChanges()
,应该允许您在表之间来回移动行


原因可能是导入以前被删除的行可能会导致问题。

行之后添加
表.AcceptChanges()
。Delete()
应允许您在表之间来回移动该行


这可能是因为导入以前删除的行可能会导致问题。

针对MAW74656在问题下的评论,我总结了将多个网格连接起来进行拖放时将使用的方法

本质上,我尝试创建一个lambda来将所有这些功能分组到一个方法中——如果需要允许多个调用者,可以将其作为自己的方法来完成

这是:

Func<DataGridView, IEnumerable<Action>> configureDragDrop = grid =>
{
    var dataTable = grid.DataSource as DataTable;

    /* Event handler definitions here - see below */

    grid.MouseDown += mds;
    grid.DragEnter += des;
    grid.DragDrop += dds;

    return new Action[]
    {
        () => grid.MouseDown -= mds,
        () => grid.DragEnter -= des,
        () => grid.DragDrop -= dds,
    };
};
事件处理程序看起来与原始代码非常相似-只是现在的lambda形式

MouseDown

            MouseEventHandler mds = (smd, emd) =>
            {
                var info = grid.HitTest(emd.X, emd.Y);
                if (info.RowIndex >= 0)
                {
                    var dr = dataTable.Rows[info.RowIndex];
                    if (dr != null)
                    {
                        grid.DoDragDrop(dr, DragDropEffects.Copy);
                    }
                }
            };
DragEnter

            DragEventHandler des = (sde, ede) =>
            {
                ede.Effect = DragDropEffects.Copy;
            };
DragDrop

            DragEventHandler dds = (sdd, edd) =>
            {
                var dr = edd.Data.GetData(typeof(DataRow)) as DataRow;
                if (dr != null)
                {
                    var dst = dataTable;
                    var src = dr.Table;
                    if (dst != src)
                    {
                        dst.ImportRow(dr);
                        dr.Delete();
                        src.AcceptChanges();
                        dst.AcceptChanges();
                    }
                }
            };

我希望这能有所帮助。

在回答MAW74656在问题下的评论时,我总结了我将使用的方法,如果我要连接多个网格来进行拖放

本质上,我尝试创建一个lambda来将所有这些功能分组到一个方法中——如果需要允许多个调用者,可以将其作为自己的方法来完成

这是:

Func<DataGridView, IEnumerable<Action>> configureDragDrop = grid =>
{
    var dataTable = grid.DataSource as DataTable;

    /* Event handler definitions here - see below */

    grid.MouseDown += mds;
    grid.DragEnter += des;
    grid.DragDrop += dds;

    return new Action[]
    {
        () => grid.MouseDown -= mds,
        () => grid.DragEnter -= des,
        () => grid.DragDrop -= dds,
    };
};
事件处理程序看起来与原始代码非常相似-只是现在的lambda形式

MouseDown

            MouseEventHandler mds = (smd, emd) =>
            {
                var info = grid.HitTest(emd.X, emd.Y);
                if (info.RowIndex >= 0)
                {
                    var dr = dataTable.Rows[info.RowIndex];
                    if (dr != null)
                    {
                        grid.DoDragDrop(dr, DragDropEffects.Copy);
                    }
                }
            };
DragEnter

            DragEventHandler des = (sde, ede) =>
            {
                ede.Effect = DragDropEffects.Copy;
            };
DragDrop

            DragEventHandler dds = (sdd, edd) =>
            {
                var dr = edd.Data.GetData(typeof(DataRow)) as DataRow;
                if (dr != null)
                {
                    var dst = dataTable;
                    var src = dr.Table;
                    if (dst != src)
                    {
                        dst.ImportRow(dr);
                        dr.Delete();
                        src.AcceptChanges();
                        dst.AcceptChanges();
                    }
                }
            };

我希望这会有所帮助。

只是猜测,但可能
table.AcceptChanges
会有所帮助things@Conrad弗里克斯-回答这个问题,这就成功了!现在我只需要想一想如何重用这些代码(我将得到5-8个我希望能够在其间拖动的GridView)。如果我错了,有人会纠正我,或者提供一个更完整的答案answer@Shyamsundarshah请停止向这些问题添加visual studio标记。无效。只是猜测一下,但可能
table.AcceptChanges
会有所帮助things@Conrad弗里克斯-回答这个问题,这就成功了!现在我只需要想一想如何重用这些代码(我将得到5-8个我希望能够在其间拖动的GridView)。如果我错了,有人会纠正我,或者提供一个更完整的答案answer@Shyamsundarshah请停止向这些问题添加visual studio标记。它是无效的。@Enigmativity-我很想在这里重用代码,但我对lambda表达式还不熟悉,有什么好的介绍文章吗?@MAW74656-要开始学习lambda,就把它们当作“内联方法”。编写
Func GetLength=t=>t.Length;
private int GetLength(string t){return t.Length;}
调用代码时-
int len=GetLength(“Hello”);
。从那里开始。此外,任何委托(
Func
Action
EventHandler
等)都可以使用lambda语法。否则,搜索StackOverflow,因为这里有大量的示例。@Enigmativity-我很想在这里重用代码,但我我对lambda表达式还不熟悉,有什么好的介绍文章吗?@MAW74656-要开始学习lambda,就把它们看作是“内联方法”。写入
Func GetLength=t=>t.Length
private int GetLength(string t){return t.Length;}
相同-
int len=GetLength(“Hello”)。从那里开始。此外,任何委托(
Func
Action
EventHandler
等)都可以使用lambda语法。否则,请搜索StackOverflow,因为这里有大量的示例。