Функциональность копирования / вставки строк в DataGridview (приложение Windows) - PullRequest
9 голосов
/ 19 января 2010

Я работаю над приложением C # для Windows и хотел бы скопировать строку в DataGridView и вставить ее в новую строку.Как мне этого добиться?Я использую .net framework 3.5.

Не могли бы вы дать мне несколько идей или код, который бы указывал, как я могу этого достичь?

Ответы [ 5 ]

7 голосов
/ 20 января 2010

Я нашел сообщение , содержащее код для вставки значений из буфера обмена в DataGridView.

Я гуглил, как вставить в DataGridView в C # из буфера обмена информацию,скопировал из Excel, и не нашел полного ответа.Собрал пару веток с форумов и придумал этот ответ, надеюсь, он кому-то облегчит жизнь.Вам не нужно понимать код, просто скопируйте и вставьте

Ниже приведена немного измененная версия.Помимо небольшого рефакторинга, я запрещаю вставлять в ячейки ReadOnly.

Пример использования:

private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{
    ClipboardUtils.OnDataGridViewPaste(sender, e);
}

Код:

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];
                        }
                    }
                }
            }
        }
    }
}
2 голосов
/ 19 января 2010

Класс DataGridViewRow имеет метод .Clone, который клонирует текущую строку, которую он содержит.

Просмотрите здесь для получения дополнительной информации

0 голосов
/ 10 июля 2019

Я попробовал ответы здесь, но в итоге получилось что-то другое из-за того, что DataGridView был привязан к данным, и из-за того, что я скрывал определенные строки, что испортило итерацию индекса строки.Это скопирует текущую выбранную строку и добавит ее в таблицу данных.Надеюсь, поможет.

    private void BtnPaste_Click(object sender, EventArgs e)
    {
        DataRow drToAdd = CopyDatagridValues(dataGridView1.CurrentRow);
        DataTable dataTable = (DataTable)dataGridView1.DataSource;

        dataTable.Rows.Add(drToAdd.ItemArray);
        dataTable.AcceptChanges();
    }


    public DataRow CopyDatagridValues(DataGridViewRow row)
    {
        DataTable dataTable = (DataTable)dataGridView1.DataSource;
        DataRow rows = dataTable.Rows[dataGridView1.CurrentRow.Index];

        return rows;
    }
0 голосов
/ 06 октября 2017

Ниже моя модифицированная версия alex2k8 , ответ будет работать для связанного просмотра данных.

вот немодифицированная версия

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

вот моя модификация, случаемся, надеюсь, кому-то помогли здесь datatatable

    ' 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

ПРИМЕЧАНИЕ: код в vb.net используется http://converter.telerik.com/, чтобы преобразовать его обратно в c #

0 голосов
/ 24 мая 2013

Копировать одну строку в другую? Почему бы просто не пойти на это, как это

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;
}

Также вы можете обратиться к: http://canlu.blogspot.com/2009/06/copying-datagridviewrow-to-another.html

Надеюсь, это поможет! :}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...