Y a-t-il un moyen facile d'ajouter Copy-Clet pour une liste de réception ou dois-je simplement passer à DataGridView à la place? P>
Mon application est un peu comme un carnet d'adresses, il contient des courriels, des numéros, etc. où la pâte de copie serait utile. P>
5 Réponses :
Il n'est pas très difficile de faire une copie manuelle et de coller, il suffit de mettre dans un gestionnaire d'événements pour Vous pouvez ajouter un menu contextuel avec copie et coller sur la liste de liste pour le rendre complet. p> clé code> (ou peut-être que keypress code> ne peut pas se souvenir mais sûr que c'est un d'entre eux) et vérifiez quelle clé est enfoncée en regardant e.keycode code> et vérifiez si e.control code> est vrai. Si c'est l'un des x code>, c code> ou v code> juste appelez clipboard.setText code> ou presse-papier. / Code> Pour écrire / lire dans / depuis le presse-papiers.
Voir ici pour la documentation MSDN de la Clipboard Code> Classe. P>
Le problème avec c'est que je ne parviens que de copier la ligne entière, à moins que des tours ne soient soignés pour sélectionner une cellule.
@ZUBIRG: Oui, j'ai oublié que vous n'avez pas vraiment de cellules dans un listview code>, il peut être plus facile de passer à un DataGridView code>. Toutefois, si vous souhaitez coller avec le listview code>, vous pouvez faire quelque chose comme la manutention Cliquez sur CODE> et MOUSEDOWN CODE> Événements sur celui-ci pour calculer ce que Subitem a cliqué sur puis changer le Backcolor code> de ce sous-sommet pour que cela ait l'air sélectionné, puis vous pouvez gérer la copie et la coller uniquement pour ce sous-sommet. Vous devriez vous assurer de définir utilsetemstyleforsubitems = false; code> sur l'élément, sinon les couleurs ne s'affichent pas sur les subitems.
L'exemple ci-dessous gère le CTRL-C en tant que copie dans la commande Presse-papiers et copie la valeur de la deuxième colonne de toutes les lignes sélectionnées: Utilisez Références: P> item.text < / Code> Pour la première colonne, et item2.SUBITEMS [N] .text code> pour d'autres colonnes. p>
Une bonne solution, je devais juste faire cela avec le Cleaudown code>. Keyup code> n'a pas fonctionné, car lorsque vous appuyez sur le C CODE>, il sélectionne automatiquement la première entrée de la liste qui a commencé avec un C code>, rendant mon multisélectionne à un seul.
Je reçois une expection invalide sur Builder.AppendorLine (item.subitems [1] .text); code> à la place, je devais utiliser Builder.appendline (item.text); code>
Mon exigence était d'ajouter un bouton pour copier une liste de numéros de série dans le presse-papiers. J'ai ajouté le bouton de la manière habituelle, puis ajouté la méthode suivante:
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);
}
}
Pourquoi ai-je été voté? Cette mise en œuvre fonctionne!
Je l'ai fait comme méthode (en fonction de la meilleure réponse de @ Brett), il suffit donc d'exécuter une fois sur l'initialisation de formulaire: Code: De plus, sur le formulaire Détruire, vous devez disposer de la méthode pour supprimer tous les événements souscrits, c'est-à-dire P> CopyablelistView (myListView) code> et il se fera. void myDeinit()
{
myListView=null;
myListView2=null;
...
}
Basé sur la réponse de @ Brett, j'ai écrit cette méthode qui copie les lignes sélectionnées entières au lieu d'une seule colonne (particulièrement bonne lorsque Fullrowselect = true).
Deux autres améliorations: P>
1. Ignorer toute nouvelle ligne - comme ListView fait. P>
2.avoid Une exception lorsqu'aucune ligne n'est sélectionnée - il suffit d'effacer le presse-papiers. P>
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();
}
}