如何在C#中点击按钮将所选项目从一个列表视图复制到另一个列表视图?

4

如何在点击按钮时从一个列表视图中复制所选项目到另一个列表视图中??无冗余,还可以为多个项目选择提供选项,并在不使用键盘上的ctrl的情况下批量添加它们吗?使其用户友好,我们可以使用复选框,它们将如何工作?? 下面的代码用于复制单个项目的选择条目,并在再次选择该项目时给出重复条目...请帮我消除这些缺陷...

private void btn_Add_Click(object sender, EventArgs e)        
{        
    CopySelectedItems(source_name, target_name);     
}

private void CopySelectedItems(ListView source, ListView target) 
{        
    foreach (ListViewItem item in source.SelectedItems) {
        target.Items.Add((ListViewItem)item.Clone());
    }
}
4个回答

5
有几种不同的方法。
如果你想要将a中的项目复制到b中:
private static void CopySelectedItems(ListView source, ListView target)
{
    foreach (ListViewItem item in source.SelectedItems)
    {
        target.Items.Add((ListViewItem)item.Clone());
    }
}

如果您想将物品从a移动到b:

private static void MoveSelectedItems(ListView source, ListView target)
{    
    while (source.SelectedItems.Count > 0)
    {
        ListViewItem temp = source.SelectedItems[0];
        source.Items.Remove(temp);
        target.Items.Add(temp);
    }            
}

更新
您提到希望保留源ListView控件中项目的顺序。我假设它们以某种排序顺序出现在那里?如果是这样,您可以创建一个函数,使用相同的排序规则来确定在目标ListView中插入项的位置(我的示例使用第二列中的值:

private static void CopySelectedItems(ListView source, ListView target)
{
    foreach (ListViewItem item in source.SelectedItems)
    {
        ListViewItem clone = (ListViewItem)item.Clone();
        target.Items.Insert(GetInsertPosition(clone, target), clone); ;
    }
}

private static int GetInsertPosition(ListViewItem item, ListView target)
{
    const int compareColumn = 1;
    foreach (ListViewItem targetItem in target.Items)
    {
        if (targetItem.SubItems[compareColumn].Text.CompareTo(item.SubItems[compareColumn].Text) > 0)
        {
            return targetItem.Index;
        }
    }
    return target.Items.Count;
}

不了解更多细节的情况下,很难给出更准确的答案。

感谢您的代码...如果我需要添加多个项目,那么在代码中我可以进行哪些修改,以便选择并将多个项目添加到目标列表视图中,请告诉我。 - zoya
@zoya:根据代码示例,它们将处理所有不同的情况(源为空、源选择了零个、一个或多个项目)。没有必要修改代码来处理这些不同的情况。 - Fredrik Mörk
抱歉我的错误,我明白了,您已经创建了一个函数。 谢谢您,先生,我尝试了它,它工作得很好。 您能告诉我如何在目标列表视图中重新生成SNo.吗? 因为它正在显示源列表视图的SNo.。 - zoya
我已经展示了代码,请检查它是否在选择相同项目时给出了重复输入。我需要避免这种情况,并且我还需要提供多个项目的选项,而不是一个接一个地输入。 - zoya
这个回答值得再次点赞,因为它付出了很多努力(并且因为它帮了大忙!) - Danejir
显示剩余5条评论

0

你需要循环遍历SelectedItems,并在第二个ListView中创建新的ListView项。

伪代码:

foreach(var item in lst1.SelectedItems)
{
    var lvi = lst2.Items.Add(item.Text);
    lvi.ImageIndex = item.ImageIndex;
    ...
}

这部分代码是做什么的? lvi.ImageIndex = item.ImageIndex; - zoya
一个ListViewItem有一个图像索引。我建议你在目标列表中创建新的ListViewItems。所以我添加了这个属性作为一个例子。http://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem.imageindex(VS.80).aspx - Arthur

0
在按钮的点击处理程序中,查找源列表中选定的项目,并将它们添加到目标列表中。就像这样:
            var insertPos = 0;
            foreach ( ListViewItem s in sourceList.SelectedItems )
            {
                s.Remove ( );
                var copyCode = Int32.Parse ( s.Text );
                while ( insertPos < destinationList.Items.Count )
                {
                    var itemAtCandidate = Int32.Parse ( destinationList.Items [ insertPos ].Text );
                    if ( itemAtCandidate > copyCode )
                        break;
                    insertPos++;
                }
                destinationList.Items.Insert ( insertPos, s );
            }

这将把“sourceList”中的所有选定项移动到“destinationList”,并保持它们的排序顺序。


谢谢,它工作得很好,但我需要按排序顺序显示它们,它在源文件中显示SNo. 我需要重新输入序列顺序。需要做哪些具体的修改? - zoya
先生,这段代码是从一个列表视图中删除项目,然后将其添加到另一个列表视图中... 我不想从一个列表视图中删除项目,我只想将它们添加到另一个列表视图中,而不从源列表视图中删除它们,同时它不应该添加重复的条目... - zoya

0
我猜想,最简单的方法可能是将第一个listView中选定的所有项保存到正确类型的列表中,然后迭代该列表以将它们全部添加到第二个listView中?
由于我不在我的开发计算机上,所以恐怕无法发布任何正确的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接