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

如何在按钮单击时将所选项目从一个列表视图复制到另一个列表视图。 如果没有任何冗余,我可以选择多个项目并将其添加到批量中而不使用键盘上的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()); } } 

有几种不同的方式。

如果要将项目从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; } 

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

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

伪代码:

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

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

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

在按钮单击处理程序中,在源列表中查找所选项目并将其添加到目标列表中。 像这样的东西:

  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”并将它们按排序顺序保留。