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

时间:2010-02-26 09:00:47

标签: c# .net listview checkbox

如何在按钮点击时将所选项目从一个列表视图复制到另一个列表视图。 没有任何冗余我也可以选择多个项目并批量添加它们而不使用键盘上的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 个答案:

答案 0 :(得分: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;
}

如果不了解更多细节,很难给出更准确的答案。

答案 1 :(得分:0)

您必须遍历SelectedItems并在第二个ListView中创建新的ListView项目。

伪代码:

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

答案 2 :(得分:0)

我会冒险猜测它会像将第一个listView中的所有选定项目保存到正确类型的列表中然后迭代通过该列表将它们全部添加到第二个listView一样简单吗?

我不在我的开发计算机上,所以我担心我无法发布任何正确的代码。

答案 3 :(得分: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”并保持排序顺序。