![](/img/trans.png)
[英]Copying Data with Skipped Columns From Excel and Pasting into 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.