带复制粘贴的Listview

时间:2010-06-12 18:23:13

标签: c# winforms listview copy-paste

是否有一种简单的方法可以为列表视图添加复制粘贴,还是应该切换到DataGridView?

我的应用程序有点像地址簿,它包含电子邮件,数字等,其中复制粘贴会很有用。

5 个答案:

答案 0 :(得分:15)

下面的示例将Ctrl-C作为copy命令的副本处理,并从所有选定的行复制第二列的值:

    private void resultsListView_KeyUp(object sender, KeyEventArgs e)
    {
        if (sender != resultsListView) return;

        if (e.Control && e.KeyCode == Keys.C)
            CopySelectedValuesToClipboard();
    }

    private void CopySelectedValuesToClipboard()
    {
        var builder = new StringBuilder();
        foreach (ListViewItem item in resultsListView.SelectedItems)
            builder.AppendLine(item.SubItems[1].Text);

        Clipboard.SetText(builder.ToString());
    }

第一列使用item.Text,其他列使用item.SubItems[n].Text

参考文献:

  1. What is the KeyChar for Ctrl+C and Ctrl+V in C#获取密钥和正确的事件处理程序。
  2. Copy ListView to Clipboard in VB.NET, C#, and VB6以获取将ListView复制到剪贴板的完整示例。

答案 1 :(得分:1)

手动复制和粘贴并不是很困难,只需为KeyDown添加一个事件处理程序(或者它可能KeyPress无法记住但是相当确定它是其中之一)并检查一下通过查看e.KeyCode按下键并检查e.Control是否为真。如果是xcv中的一个,只需致电Clipboard.SetTextClipboard.GetText即可向剪贴板写入/读取内容。
有关Clipboard类的MSDN文档,请参阅here

您可以将复制和粘贴的上下文菜单添加到ListView,以使其完整。

答案 2 :(得分:1)

我已经将其作为方法(取决于@brett的最高答案),因此只需在Form初始化上执行一次:copyableListView(myListView),它将自行完成。

代码:

private void copyableListView(ListView listView)
{
    listView.KeyDown += (object sender, KeyEventArgs e) =>
    {
        if (!(sender is ListView)) return;

        if (e.Control && e.KeyCode == Keys.C)
        {
            var builder = new StringBuilder();
            foreach (ListViewItem item in (sender as ListView).SelectedItems)
                builder.AppendLine(item.Text + Environment.NewLine);
            Clipboard.SetText(builder.ToString());
        }
    };
}

此外,在销毁表单时,您应该具有删除所有已订阅事件的方法,即

void myDeinit()
{
    myListView=null;
    myListView2=null;
    ...
}

答案 3 :(得分:0)

我的要求是添加一个按钮,将序列号列表复制到剪贴板。我以正常方式添加了按钮,然后添加了以下方法:

private void btnClipboard_Click(object sender, EventArgs e)
{
    String clipText = string.Empty;
    foreach (ListViewItem item in lstSerials.Items)
    {
        clipText += item.SubItems[0].Text;
        clipText += Environment.NewLine;
    }
    if (!String.IsNullOrEmpty(clipText))
    {
        Clipboard.SetText(clipText);
    }
}

答案 4 :(得分:0)

基于@Brett的回答,我编写了此方法,该方法可复制整个选定的行,而不是复制单个列(当FullRowSelect = true时特别好)。

另外两项改进:

1。忽略任何换行符,就像ListView一样。

2。如果未选择任何行,请避免发生异常-只需清除剪贴板即可。

private void ListViewLogs_KeyDown(object sender, KeyEventArgs e)
{
    CopySelectedRowsToClipboard(listViewLogs, e);
}

private void CopySelectedRowsToClipboard(ListView listView, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.C)
    {
        var builder = new StringBuilder();
        foreach (ListViewItem item in listView.SelectedItems)
        {
            var subItems = item.SubItems.Cast<ListViewItem.ListViewSubItem>()
                .Select(subItem => subItem.Text);
            builder.AppendLine(string.Join(", ", subItems).Replace(Environment.NewLine, ""));
        }

        if (builder.Length > 0)
            Clipboard.SetText(builder.ToString());
        else
            Clipboard.Clear();
    }
}