C# 拖放在C中不起作用#
我知道了如何从中拖动DataGridView之间的行,但现在我遇到了一个问题。我可以将该行从gridPODetails拖到DataGridView1。我可以将该行从DataGridView1拖回GridPodDetails。但在那之后我什么也得不到。我希望能够不确定地来回拖动,但我只能来回拖动。这可能是什么原因造成的?如何纠正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) {
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调用代码时,code>与private int GetLength(string t){return t.Length;}
相同-int len=GetLength(“Hello”)代码>。从那里开始。此外,任何委托(Func
、Action
、EventHandler
等)都可以使用lambda语法。否则,请搜索StackOverflow,因为这里有大量的示例。