亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Datagridview - 將選定的單元格復制到新的 DataTable

Datagridview - 將選定的單元格復制到新的 DataTable

C#
jeck貓 2022-12-31 10:27:34
我需要將數據從 DataGridView 導出到 Excel,但只能導出選定的單元格。DataGridView 綁定到 DataTable。我看過很多關于如何復制選定行的示例,但找不到關于如何僅將選定單元格復制到新 DataTable 中的示例。到目前為止,這是我嘗試過的:  //First, copy structure of DataTable into new one  DataTable dt = ((DataTable)dgv.DataSource).Clone();  //Then insert data into new datatable  foreach (DataGridViewCell cell in dgv.SelectedCells)  {    //We get Index of column and row from bounded DataTable      int col_indx = ((DataTable)dgv.DataSource).Columns.IndexOf(dgv.Columns[cell.ColumnIndex].Name);     int row_indx = ((DataTable)dgv.DataSource).Rows.IndexOf(((DataRowView)dgv.Rows[cell.RowIndex].DataBoundItem).Row);  //First check if row already exists  if (dt.Columns.Contains(dgv.Columns[cell.ColumnIndex].Name))            {                DataRow newrow = dt.NewRow();                newrow[col_indx] = cell.Value;                dt.Rows.InsertAt(newrow, row_indx);            }            else            {               dt.Rows[row_indx][cell_indx] = cell.Value;            }      }   dt.AcceptChanges();這部分將數據插入到新的數據表中,但如果我從同一行中選擇一些單元格,則在不同的行中。我怎樣才能解決這個問題 ?編輯: for (int i = 0; i < dgv.Rows.Count; i++) {     dt.Rows.Add();     for (int j = 0; j < dgv.ColumnCount; j++)     {        if (dgv.Rows[i].Cells[j].Selected == true)        {           dt.Rows[i][j] = dgv.Rows[i].Cells[j].Value;        }     }  }   dt.AcceptChanges();這是我能實現的最接近的事情。它將選定的數據復制到新的 DataTable 中,但不幸的是它也保留了空行。因此,當我從例如第 3 行選擇 Datagridview 中的單元格時,Excel 中的輸出將前 2 行為空。我想避免這種情況,但是如何呢?...換句話說,我在 Datagridview 中選擇的內容必須從第 1 行的新數據表開始,依此類推...
查看完整描述

3 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

您為每一行添加一行。您必須為每個選定的行添加一行。試試這個


 int k=0;

 bool addRow;

 for (int i = 0; i < dgv.Rows.Count; i++)

 {

     addRow=true;

     for (int j = 0; j < dgv.ColumnCount; j++)

     {

        if (dgv.Rows[i].Cells[j].Selected == true)

        {

            if(addRow){

                dt.Rows.Add();

                addRow=false;

                k++;

            }

            dt.Rows[k-1][j] = dgv.Rows[i].Cells[j].Value;

        }

     }

  }

   dt.AcceptChanges();


查看完整回答
反對 回復 2022-12-31
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

問題解決了。但這并不容易。首先,我必須創建一個與有界數據表具有相同結構的新數據表。然后將所有選定的單元格復制到該數據表中。最后,我創建了一個新的 DataTable,其中只有不為空的行,使用來自 Levitikon 的這個答案的 CopyToDataTable方法。這是完整的代碼:


//First, copy structure of DataTable into new one

DataTable dt = ((DataTable)dgv.DataSource).Clone();


//Add all selected cells into this DataTable

for (int i = 0; i < dgv.Rows.Count; i++)

 {

     dt.Rows.Add();

     for (int j = 0; j < dgv.ColumnCount; j++)

     {

        if (dgv.Rows[i].Cells[j].Selected == true)

        {

           dt.Rows[i][j] = dgv.Rows[i].Cells[j].Value;

        }

     }

  }

   dt.AcceptChanges();


 // Then create a new DataTable without blank rows

 DataTable final_dt = dt.Rows.Cast<DataRow>()

 .Where(row => !row.ItemArray.All(field => field is DBNull ||

 string.IsNullOrWhiteSpace(field.ToString()))).CopyToDataTable();

現在,我在 DataGridView 中選擇的所有內容都會添加到新的 DataTable 中,一旦我在 Excel 中導出此 DataTable,所有數據都會根據需要從第 0 行開始。如果有人知道更好/更短的解決方案,請告訴我。


查看完整回答
反對 回復 2022-12-31
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

您正在遍歷每個選定的單元格,并在指定的row_indx處創建/插入一個新行,而不檢查這些單元格是否屬于同一行,以及dt是否已經在row_indx處插入了一行。

我建議檢查您是否已經在row_indx處插入了一行,如果它已經插入該行并將選定的單元格添加到其中,如果它沒有該行則創建一個新行并添加選定的單元格。


查看完整回答
反對 回復 2022-12-31
  • 3 回答
  • 0 關注
  • 421 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號