Вставка данных из Excel в DataGridView - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь вставить данные из Excel в мое представление данных с помощью C #. В сети я нашел некоторый код, который работает, однако заголовок моего представления таблицы данных заполняется первой строкой вставленных данных (согласно приведенному ниже снимку экрана).

Я бы хотел, чтобы заголовки столбцов были пустыми, и, если возможно, запишите данные в строки представления сетки данных. Заранее спасибо, пожалуйста, найдите ниже используемый код и скриншоты.

private void btnPaste_Click(object sender, EventArgs e)
    {
        DataObject o = (DataObject)Clipboard.GetDataObject();
        if (o.GetDataPresent(DataFormats.Text))
        {
            if (dgvAuthG.RowCount > 0)
                dgvAuthG.Rows.Clear();

            if (dgvAuthG.ColumnCount > 0)
                dgvAuthG.Columns.Clear();

            bool columnsAdded = false;
            string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n");
            int j = 0;
            foreach (string pastedRow in pastedRows)
            {
                string[] pastedRowCells = pastedRow.Split(new char[] { '\t' });

                if (!columnsAdded)
                {
                    for (int i = 0; i < pastedRowCells.Length; i++)
                        dgvAuthG.Columns.Add("col" + i, pastedRowCells[i]);

                    columnsAdded = true;
                    continue;
                }

                dgvAuthG.Rows.Add();
                int myRowIndex = dgvAuthG.Rows.Count - 1;

                using (DataGridViewRow myDataGridViewRow = dgvAuthG.Rows[j])
                {
                    for (int i = 0; i < pastedRowCells.Length; i++)
                        myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
                }
                j++;
            }
        }
        dgvAuthG.Columns.RemoveAt(0);
        btnFormat.Enabled = true;
        btnFormatWay4.Enabled = true;
    }

введите описание изображения здесь

1 Ответ

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

Ваш код добавляет данные в заголовок столбца со строкой ...

dgvAuthG.Columns.Add("col" + i, pastedRowCells[i]);

… вторым параметром является текст заголовка. Я не уверен, что вы ожидаете здесь. Если вы хотите, чтобы заголовок столбца был «пустым», не добавляйте текст, как делает код.

Я настоятельно рекомендую вам отдельно добавлять столбцы в сетку из цикла, который добавляет строки. Это просто делает код цикла при добавлении строки сложным и ненужным. Вы «знаете», что ТОЛЬКО будете запускать этот код (добавляя столбцы) ОДИН РАЗ. Поэтому я рекомендую вам добавить столбцы перед началом добавления строк.

Проблема в том, что нам нужно прочитать одну из строк, чтобы получить количество столбцов. Поэтому было бы полезно, если бы у нас был этот номер столбца до того, как мы начали добавлять строки, мы могли бы затем использовать его для циклического перемещения по ячейкам в каждой строке. Вам нужно сделать это только один раз, и это может выглядеть следующим образом.

int totCols = pastedRows[0].Split(new char[] { '\t' }).Length;

Теперь, когда у вас есть количество столбцов для сетки, должен работать простой цикл добавления столбцов.

for (int i = 0; i < totCols; i++) {
  dgvAuthG.Columns.Add("col" + i, "col" + i);
}

Это обеспечивает добавление столбцов в сетку и, безусловно, сделает цикл по строкам более простым и менее сложным.

Однако до этого я предполагаю, что вы, возможно, захотите пересмотреть «проверку», есть ли в сетке какие-либо существующие столбцы или строки. Вполне вероятно, что существующее количество столбцов НЕ будет соответствовать тому, что находится в «ClipBoard». Из-за этого нет смысла проверять ... просто удалить все столбцы и начать все сначала. В противном случае сбой почти гарантирован.

Наконец, я использовал другой подход к добавлению строк. По сути, код получает индекс для новой строки и добавляет значения, проходя по ячейкам. Соединение всего этого может выглядеть примерно так:

private void button1_Click(object sender, EventArgs e) {
  DataObject o = (DataObject)Clipboard.GetDataObject();
  if (o.GetDataPresent(DataFormats.Text)) {
    dgvAuthG.Columns.Clear();
    string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n");
    int totCols = pastedRows[0].Split(new char[] { '\t' }).Length;
    for (int i = 0; i < totCols; i++) {
      dgvAuthG.Columns.Add("col" + i, "col" + i);
    }
    string[] pastedRowCells;
    int newRowIndex;
    foreach (string pastedRow in pastedRows) {
      pastedRowCells = pastedRow.Split(new char[] { '\t' });
      newRowIndex = dgvAuthG.Rows.Add();
      for (int i = 0; i < totCols; i++) {
        dgvAuthG.Rows[newRowIndex].Cells[i].Value = pastedRowCells[i];
      }
    }
  }
  //dgvAuthG.Columns.RemoveAt(0);
  //btnFormat.Enabled = true;
  //btnFormatWay4.Enabled = true;
}

Надеюсь, это поможет.

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