是否有一种简单的方法可以为列表视图添加复制粘贴,还是应该切换到DataGridView?
我的应用程序有点像地址簿,它包含电子邮件,数字等,其中复制粘贴会很有用。
答案 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 :(得分:1)
手动复制和粘贴并不是很困难,只需为KeyDown
添加一个事件处理程序(或者它可能KeyPress
无法记住但是相当确定它是其中之一)并检查一下通过查看e.KeyCode
按下键并检查e.Control
是否为真。如果是x
,c
或v
中的一个,只需致电Clipboard.SetText
或Clipboard.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();
}
}