Is there an easy way of adding copy-paste for a listview, or should I just switch to DataGridView instead?
My application is kinda like an address book, it contains emails, numbers etc where copy paste would be useful.
The example below handles the Ctrl-C as a copy to the clipboard command, and copies the second column's value from all the selected rows:
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());
}
Use item.Text
for the first column, and item.SubItems[n].Text
for other columns.
References:
It's not very difficult to do manual copy and paste, just put in an event handler for KeyDown
(or maybe it's KeyPress
can't remember but fairly sure it's one of them) and check what key is pressed by looking at e.KeyCode
and check if e.Control
is true. If it's one of x
, c
or v
just call Clipboard.SetText
or Clipboard.GetText
to write/read to/from the clipboard.
See here for the MSDN documentation of the Clipboard
class.
You could add a context menu with Copy and Paste on to the ListView also to make it complete.
I've made it as method (depending on @brett's top answer), so just execute once on Form initialization: copyableListView(myListView)
and it will do itself.
Code:
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());
}
};
}
Also, on form destroy, you should have method to remove all subscribed-events, i.e.
void myDeinit()
{
myListView=null;
myListView2=null;
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With