Robert S4r Ответов: 2

Как скопировать и вставить значения ячеек datagridview в C#


Я разрабатываю настольное приложение на языке c#. Копия, кажется, работает хорошо, но при вставке значений буфера обмена она выдает ошибку строка должна быть ровно один символ длиной в строке:
string [] lines = clipboardvalues.Сплит(char.Синтаксический анализ(среда. новая строка));

Как я могу исправить это, чтобы вставить ячейки в datagridview.

Что я уже пробовал:

private DataGridViewCell GetStartingCell(DataGridView dgView)
{
    if (dgView.SelectedCells.Count == 0)
    {
        return null;
    }
    int rowIndex = dgView.Rows.Count - 1;
    int ColIndex = dgView.Columns.Count - 1;

    foreach (DataGridViewCell dgvcell in dgView.SelectedCells)
    {
        if (dgvcell.RowIndex < rowIndex)
        {
            rowIndex = dgvcell.RowIndex;
        }
        if (dgvcell.ColumnIndex < ColIndex)
        {
            ColIndex = dgvcell.ColumnIndex;
        }
    }
    return dgView[ColIndex, rowIndex];
}
private Dictionary<int, Dictionary<int, string>> ClipboardValues(string clipboardvalue)
{
    Dictionary<int, Dictionary<int, string>> copyValues = new Dictionary<int, Dictionary<int, string>>();
    string[] lines = clipboardvalue.Split(char.Parse(Environment.NewLine));
    for (int i = 0; i < lines.Length; i++)
    {
        copyValues[i] = new Dictionary<int, string>();
        string[] linecontent = lines[i].Split((char)Keys.Tab);
        if (linecontent.Length == 0)
        {
            copyValues[i][0] = string.Empty;
        }
        else
        {
            for (int j = 0; j < linecontent.Length; j++)
            {
                copyValues[i][j] = linecontent[j];
            }
        }
    }
    return copyValues;
}
public void PasteClipboardValue ()
{
    if (STMDataGridView.Focus())
    {
        if (STMDataGridView.SelectedCells.Count == 0)
        {
            MessageBox.Show("Please, select a cell", "Paste", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return;
        }
        DataGridViewCell StartingCell = GetStartingCell(STMDataGridView);
        Dictionary<int, Dictionary<int, string>> cbvalue = ClipboardValues(Clipboard.GetText());
        int irowindex = StartingCell.RowIndex;
        foreach (int rowkey in cbvalue.Keys)
        {
            int icolindex = StartingCell.ColumnIndex;
            foreach (int cellkey in cbvalue[rowkey].Keys)
            {
                if (icolindex <= STMDataGridView.Columns.Count - 1 && irowindex <= STMDataGridView.Rows.Count - 1)
                {
                    DataGridViewCell cell = STMDataGridView[icolindex, irowindex];
                    cell.Value = cbvalue[rowkey][cellkey].TrimStart();
                }
                icolindex += 1;
            }
            irowindex += 1;
        }
    }

}

Richard MacCutchan

Я предполагаю, что сообщение об ошибке говорит вам, что ваша исходная строка пуста. Ваш отладчик подтвердит это.

Robert S4r

Но когда я вставляю в любой текстовый редактор, скажем MS office word, он вставляет данные, то есть копирует их в буфер обмена.

Richard MacCutchan

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

2 Ответов

Рейтинг:
1

Maciej Los

Зачем заставлять двери широко распахиваться?

Проверить это: DataGridViewRow.Метод Клонирования (System.Окна.Формы) | Microsoft Docs[^]
Там вы найдете CloneWithValues метод, который принимает DataGridViewRow в качестве входного параметра и возвращает клонированную строку с набором исходных значений. Вы можете адаптировать этот метод к вашим требованиям.


Рейтинг:
0

Richard MacCutchan

Я провел дальнейшее расследование. Проблема в том, что Environment.NewLine возвращает строку "\r\n", так что вы не можете разобрать это до одного символа. Попробовать это:

string[] lines = clipboardvalue.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);


Maciej Los

5ed!

Richard MacCutchan

Спасибо Мацей (и за все остальные апвоты). Удивительно, что вы можете обнаружить с помощью небольшой отладки.