9
votes

Fonctionnalité de copie / pâte de ligne dans DataGridView (application Windows)

Je travaille sur une application Windows C # et souhaitez copier une ligne dans un DataGridView et la coller dans une nouvelle ligne. Comment puis-je y parvenir? J'utilise .NET Framework 3.5.

Pouvez-vous me fournir des idées ou du code qui indiquerait comment je pourrais y parvenir?


0 commentaires

5 Réponses :



7
votes

Je l'ai trouvé un Post qui contient du code pour coller des valeurs de Presse-papiers dans DataGridView.

J'étais googling comment coller à DataGridView en C # dans le presse-papier, un info, copié de Excel, et n'a pas trouver une réponse complète. Collecté couple de threads de forums et est venu avec cette réponse, espérons que ça va faire la vie de quelqu'un plus facile. Vous n'avez pas à comprendre le code juste copier et Coller p> blockQuote>

ci-dessous est une version à modification des bits. Au-delà du petit refactoring, j'interdie la coller dans des cellules réadonnées. P>

Exemple d'utilisation: P>

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Commons
{
    public class ClipboardUtils
    {
        public static void OnDataGridViewPaste(object grid, KeyEventArgs e)
        {
            if ((e.Shift && e.KeyCode == Keys.Insert) || (e.Control && e.KeyCode == Keys.V))
            {
                PasteTSV((DataGridView)grid);
            }
        }

        public static void PasteTSV(DataGridView grid)
        {
            char[] rowSplitter = { '\r', '\n' };
            char[] columnSplitter = { '\t' };

            // Get the text from clipboard
            IDataObject dataInClipboard = Clipboard.GetDataObject();
            string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);

            // Split it into lines
            string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries);

            // Get the row and column of selected cell in grid
            int r = grid.SelectedCells[0].RowIndex;
            int c = grid.SelectedCells[0].ColumnIndex;

            // Add rows into grid to fit clipboard lines
            if (grid.Rows.Count < (r + rowsInClipboard.Length))
            {
                grid.Rows.Add(r + rowsInClipboard.Length - grid.Rows.Count);
            }

            // Loop through the lines, split them into cells and place the values in the corresponding cell.
            for (int iRow = 0; iRow < rowsInClipboard.Length; iRow++)
            {
                // Split row into cell values
                string[] valuesInRow = rowsInClipboard[iRow].Split(columnSplitter);

                // Cycle through cell values
                for (int iCol = 0; iCol < valuesInRow.Length; iCol++)
                {

                    // Assign cell value, only if it within columns of the grid
                    if (grid.ColumnCount - 1 >= c + iCol)
                    {
                        DataGridViewCell cell = grid.Rows[r + iRow].Cells[c + iCol];

                        if (!cell.ReadOnly)
                        {
                            cell.Value = valuesInRow[iCol];
                        }
                    }
                }
            }
        }
    }
}


1 commentaires

Nice code. Pas prêt pour le temps de qualité, mais la plupart du chemin là-bas. Je l'ai utilisé dans un projet personnel et travaille aussi longtemps que vous laissez lentement le "V 'dans Ctrl + V en premier, et la grille doit être en édition de EdiDonkeystrokeorf2



0
votes

Copier une ligne à une autre? Pourquoi simplement ne pas y aller comme celui-ci

public DataGridViewRow CloneWithValues(DataGridViewRow row)
{
    DataGridViewRow clonedRow = (DataGridViewRow)row.Clone();
    for (Int32 index = 0; index < row.Cells.Count; index++)
    {
        clonedRow.Cells[index].Value = row.Cells[index].Value;
    }
    return clonedRow;
}


0 commentaires

0
votes

ci-dessous est ma version modifiée de alex2k8 em> forte> réponse à ce que cela fonctionnera pour Louid DataGridView. p>

Voici la version non modifiée p>

    ' Add rows into grid to fit clipboard lines
    If grid.Rows.Count < (r + rowsInClipboard.Length) Then
        Dim workRow As DataRow
        Dim i As Integer

        For i = 0 To (r + rowsInClipboard.Length - grid.Rows.Count)
            workRow = dt.NewRow()
            workRow(0) = ""

            dt.Rows.Add(workRow)
        Next
    End If


0 commentaires

0
votes

J'ai essayé les réponses ici, mais j'ai fini par avoir à quelque chose de différent en raison de la DataGridView étant Databound et le fait que je cache certaines lignes qui gâchent l'itération sur l'indice de rangée. Ceci copie la ligne sélectionnée actuelle et l'ajoute au jeu de données. J'espère que ça aide. xxx


0 commentaires