gpt4 book ai didi

c# - 在 C# Windows 窗体中的同一 ListView 控件中重新排序/移动/拖放 ListView 项目

转载 作者:行者123 更新时间:2023-11-30 19:41:34 24 4
gpt4 key购买 nike

我在 C# 2008 系统 Windows 窗体中有一个 LargeIcon View 中的 ListView。现在,我想将此 ListView 的一个项目移动到另一个位置的同一 ListView 中 - 让我们称其为“拖放”或“项目重新排序”或其他名称。 VB 6 能够做到这一点,并在任何 listView 中自动执行此操作。

C#好像没有这个功能或者需要先编码。对于编码这个我没有经验,我在互联网上的研究中没有找到答案。我只找到了一个不起作用的“覆盖程序”。

我不需要任何其他 ListView 控件(如 ObjectListView 或其他),也不需要覆盖过程或制作新的 ListView 控件。我想在 Microsoft 提供的 ListView 控件中按原样处理它。对此有任何想法。我相信代码将不胜感激除非它是一个非常简单的单行代码,否则我无法自己完成。

PS:如果项目需要移动,我需要移动项目的所有属性(文本、标签、图像键、背景颜色、前景颜色、名称、工具提示文本等)。我不知道这是如何实现的。我发现了一个提示:它的存在是为了删除一个项目(称为 .Remove())并插入称为 .Insert()。但是有了这些信息,我仍然无法通过鼠标“移动”项目。我认为 listView 的所有 DragEvents 都在这里发挥作用,但我不知道如何使用它们以及如何将所选项目 (listView1.SelectedItems) 复制到右侧位置和首先获得这个位置的需要。

最佳答案

事实上,Winforms 不支持您所说的功能,而不是 C#。 C# 与此类功能无关;它是一种 UI 技术特性,而不是语言特性。但是,要解决这个问题,我们这里几乎没有代码。它支持每个 ListViewItemPosition 属性用于该目的(在 LargeIcon View 中)。另一个重要的属性是 AutoArrange,应该将其设置为 false 以允许 Position 生效。这是代码:

ListViewItem heldDownItem;
Point heldDownPoint;
//MouseDown event handler for your listView1
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
//listView1.AutoArrange = false;
heldDownItem = listView1.GetItemAt(e.X,e.Y);
if (heldDownItem != null) {
heldDownPoint = new Point(e.X - heldDownItem.Position.X,
e.Y - heldDownItem.Position.Y);
}
}
//MouseMove event handler for your listView1
private void listView1_MouseMove(object sender, MouseEventArgs e)
{
if (heldDownItem != null){
heldDownItem.Position = new Point(e.Location.X - heldDownPoint.X,
e.Location.Y - heldDownPoint.Y);
}
}
//MouseUp event handler for your listView1
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
heldDownItem = null;
//listView1.AutoArrange = true;
}

注意:如您所见,如果您想重新排序而不是更改,我将 2 行注释代码行 listView1.AutoArrange 放在那里ListViewItem 位置,您可以取消注释这些行。我可以注意到这里有些闪烁(当你处理 winforms ListView 时这是正常的),所以你应该使用这段代码(可以放在表单构造函数中)来启用 DoubleBuffered:

typeof(Control).GetProperty("DoubleBuffered", 
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance)
.SetValue(listView1, true, null);

关于c# - 在 C# Windows 窗体中的同一 ListView 控件中重新排序/移动/拖放 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19405328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com