簡體   English   中英

將數據從Excel粘貼到DataGridView

[英]Pasting Data from Excel to DataGridView

我正在嘗試使用C#將數據從excel粘貼到我的數據網格視圖中。 我在網上找到了一些行之有效的代碼,但是我的數據網格視圖的標題中填充了粘貼數據的第一行(如下面的屏幕截圖所示)。

我希望列標題為空,並在可能的情況下將數據寫入數據網格視圖行中。 在此先感謝您,請在下面找到所使用的代碼和屏幕截圖。

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

在此處輸入圖片說明

您的代碼將數據添加到帶有行的列標題中……

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

這樣就可以將列添加到網格中,並且肯定會使遍歷行更容易且更簡單。

但是,在此之前,我猜測您可能需要重新考慮“檢查”網格是否具有任何現有的列或行。 現有的列數很可能與“剪貼板”中的列數不匹配。因此,檢查...沒有意義,只需刪除所有列並重新開始。 否則,幾乎可以保證發生崩潰。

最后,我使用了另一種方法來添加行。 基本上,代碼獲取到新行的索引,並通過循環單元格來添加值。 將所有這些放在一起可能看起來像下面的樣子。

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

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM