【问题标题】:How to copy the selected items from one listview to another on button click in c#net?如何在 c#net 中单击按钮时将所选项目从一个列表视图复制到另一个?
【发布时间】:2011-01-21 09:04:07
【问题描述】:

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

【问题讨论】:

    标签: c# .net listview checkbox


    【解决方案1】:

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

    伪代码:

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

    【讨论】:

    • 这部分是做什么的?? lvi.ImageIndex = item.ImageIndex;
    • 一个 ListViewItem 有一个图像索引。我建议您在目标列表中创建新的 ListViewItems。因此,我添加了该属性作为示例。 msdn.microsoft.com/en-us/library/…
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在按钮单击处理程序中,在源列表中找到选定的项目并将它们添加到目标列表中。像这样:

                  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 的排序顺序显示它们。因此在源文件中..我需要重新输入串行顺序..要进行哪些具体修改??
      • 先生,此代码正在从一个列表视图中删除项目,然后将其添加到其他...我不想从一个列表视图中删除项目我只想将这些项目添加到其他列表视图而不从中删除它们源列表视图也不应该添加重复的条目...
      【解决方案4】:

      有几种不同的方法。

      如果你想复制项目从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:正如代码示例所示,它们将处理所有不同的情况(源为空,源为零,选择了一项或多项)。无需修改代码即可处理这些不同的场景。
      • 先生,我不明白这个 CopySelectedItems 事件是从哪里来的??这是listview的事件吗??
      • 对不起我的错误我明白了你已经做了一个功能..谢谢先生我试过了..它工作正常..你能告诉我如何再生 SNo。在目标列表视图中.. 因为它正在显示 SNo。源列表视图的..
      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2022-01-23
      相关资源
      最近更新 更多