WPF datagrid coller
J'ai de la difficulté à coller à partir d'un fichier csv dans le wpf datagrid - j'ai suivi les suggestions ici
et le code exectues avec pas de problème, cependant, il semble que toutes les nouvelles lignes sont créées, mais seule la première ligne est renseignée avec les données. Les données semblent être constamment remplacés, de sorte que le dernier élément dans le presse-papiers de données est renseignée dans la première ligne et toutes les autres lignes sont vides. Je sais que ce doit être un indice de la question ou quelque chose, mais je ne peux pas le retrouver.
Aussi quand je regarde les objets de la grille peut être liée collection n'ont pas de toutes les données. Est-il quelque chose dans le OnPastingCellClipboardContent de la colonne qui va mal (conversion de données peut-être)?
Toutes les idées (voir le code ci-dessous)
protected virtual void OnExecutedPaste(object sender, ExecutedRoutedEventArgs args)
{
//parse the clipboard data
List<string[]> rowData = ClipboardHelper.ParseClipboardData();
bool hasAddedNewRow = false;
//call OnPastingCellClipboardContent for each cell
int minRowIndex = Math.Max(Items.IndexOf(CurrentItem), 0);
int maxRowIndex = Items.Count - 1;
int minColumnDisplayIndex = (SelectionUnit != DataGridSelectionUnit.FullRow) ? Columns.IndexOf(CurrentColumn) : 0;
int maxColumnDisplayIndex = Columns.Count - 1;
int rowDataIndex = 0;
for (int i = minRowIndex; i <= maxRowIndex && rowDataIndex < rowData.Count; i++, rowDataIndex++)
{
if (CanUserAddRows && i == maxRowIndex)
{
//add a new row to be pasted to
ICollectionView cv = CollectionViewSource.GetDefaultView(Items);
IEditableCollectionView iecv = cv as IEditableCollectionView;
if (iecv != null)
{
hasAddedNewRow = true;
iecv.AddNew();
if (rowDataIndex + 1 < rowData.Count)
{
//still has more items to paste, update the maxRowIndex
maxRowIndex = Items.Count - 1;
}
}
}
else if (i == maxRowIndex)
{
continue;
}
int columnDataIndex = 0;
for (int j = minColumnDisplayIndex; j < maxColumnDisplayIndex && columnDataIndex < rowData[rowDataIndex].Length; j++, columnDataIndex++)
{
DataGridColumn column = ColumnFromDisplayIndex(j);
column.OnPastingCellClipboardContent(Items[i], rowData[rowDataIndex][columnDataIndex]);
}
}
}
Vous devez vous connecter pour publier un commentaire.
Pour ceux qui sont intéressés - il ne semble pas être quelque chose qui va pas avec les colonnes tenter de mettre à jour la valeur de la bindable objet possible conversion de type de données j'ai donc mis en œuvre moi-même et il fonctionne comme un charme maintenant.
}
Petite correction dans CsvHelper.cs de @eric-ouellet de réponse. Lors de la copie à partir d'Excel avec une cellule vide, la cartographie des données ne s'applique pas correctement. J'ai modifié la Regex pour ParseLineTabSeparated méthode.
Si je suis en droit de vous doit également besoin d'une vérification de plage pour la variable j:
Sinon vous obtiendrez un ArgumentOutOfRangeException lors du collage de contenu avec plus de colonnes de la grille peut effectivement tenir.
https://www.codeproject.com/Articles/1172338/Easy-WPF-Copy-Paste-Excel
Le lien ci-dessus donne le "la Pâte dans la grille de données" fonctionnalité avec un package Nuget.
Bool type de soutien est manquant. J'ai dû télécharger la source et le modifier convertes.cs.