2013-05-27 12 views
12

ho alcuni dati in una griglia che attualmente mostra come questo:Come unire DataGridView cellulare in WinForms

------------------ 
|Hd1| Value | 
------------------ 
|A | A1  | 
------------------ 
|A | A2  | 
------------------ 
|A | A3  | 
------------------ 
|A | A4  | 
------------------ 
|B | B1  | 
------------------ 
|B | B2  | 
------------------ 
|B | B3  | 
------------------ 
|B | B4  | 
------------------ 
|B | B5  | 
------------------ 
|C | C1  | 
------------------ 
|C | C2  | 
------------------ 

voglio farlo sembrare come questo:

|Hd | Value | 
------------------ 
|A | A1  | 
    ---------- 
| | A2  | 
    ---------- 
| | A3  | 
    ---------- 
| | A4  | 
------------------ 
|B | B1  | 
    ---------- 
| | B2  | 
    ---------- 
| | B3  | 
    ---------- 
| | B4  | 
    ---------- 
| | B5  | 
------------------ 
|C | C1  | 
    ---------- 
| | C2  | 
------------------ 

C'è un modo che posso unire queste cellule? Ho provato in molti modi anche google ma non ho trovato nessun modo adatto. Se è possibile mostrare questi dati in un altro modo senza usare datagridview ma il risultato è il modo in cui ho mostrato, questo risolverà anche il mio problema.

risposta

5

Il controllo DataGridView non ha proprietà o metodi correlati per unire le celle, ma è possibile ottenere lo stesso utilizzando la verniciatura personalizzata. È possibile utilizzare l'evento DataGridView.CellPainting o sovrascrivere il metodo Paint.

Inoltre, sarà necessario eseguire l'override di DataGridView.CellClick, CellEnter, CellFormatting e altri metodi per fornire a DataGridView una funzionalità completa. Ad esempio, al clic della cella, l'intera cella unita (o il gruppo di celle che costituisce una cella unita) dovrà essere personalizzata.

Potete trovare alcuni esempi di codice qui:

http://social.msdn.microsoft.com/forums/en-US/vbinterop/thread/5b659cbd-7d29-4da4-8b38-5d427c3762e2

http://forums.codeguru.com/showthread.php?415930-DataGridView-Merging-Cells

http://www.codeproject.com/Questions/152113/How-can-i-merge-DataGridView-Rows-Cells-with-Equal

25

È necessario prima trovare un duplicato Valori

Necessità di due metodi:

bool IsTheSameCellValue(int column, int row) 
{ 
    DataGridViewCell cell1 = dataGridView1[column, row]; 
    DataGridViewCell cell2 = dataGridView1[column, row - 1]; 
    if (cell1.Value == null || cell2.Value == null) 
    { 
     return false; 
    } 
    return cell1.Value.ToString() == cell2.Value.ToString(); 
} 

nel caso, cellpainting:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None; 
    if (e.RowIndex < 1 || e.ColumnIndex < 0) 
     return; 
    if (IsTheSameCellValue(e.ColumnIndex, e.RowIndex)) 
    { 
     e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None; 
    } 
    else 
    { 
     e.AdvancedBorderStyle.Top = dataGridView1.AdvancedCellBorderStyle.Top; 
    } 
} 

adesso formattazione di cella:

if (e.RowIndex == 0) 
    return; 
if (IsTheSameCellValue(e.ColumnIndex, e.RowIndex)) 
{ 
    e.Value = ""; 
    e.FormattingApplied = true; 
} 

e in form_load:

dataGridView1.AutoGenerateColumns = false; 

Image of DGV_Merge

+0

Ottimo lavoro. – user2211290

+1

Buon lavoro! puoi aiutarmi come posso unire le colonne, voglio un singolo elemento su più colonne – robot

0

Ci sono alcune buone risposte su asp.net ma in winform e per questo esempio (fusione degli stessi dati in colonne) non è definito.

È possibile utilizzare color.transparent per nascondere gli stessi valori in datagridview. anche da questo codice, le stesse righe non vengono cancellate e possono essere utili per i calcoli matematici. anche tu puoi definire quali colonne unire per tipo di desiderio.

In questo modo se la fine di "A" era "A4" e anche l'inizio di "B" era "A4" quelli non sarebbero uniti. che è spesso più desiderato.(Se non si desidera, utilizzare meglio altre risposte)

MergeGridviewCells (DGV, new int [] {0,1}); // Ad esempio, se si desidera unire i primi dati delle colonne/quindi 3a colonna e quindi seconda colonna è possibile utilizzare new int [] {0,2,1}

private void MergeGridviewCells(DataGridView DGV, int[] idx) 
    { 
     DataGridViewRow Prev = null; 

     foreach (DataGridViewRow item in DGV.Rows) 
     { 
      if (Prev != null) 
      { 
       string firstCellText = string.Empty; 
       string secondCellText = string.Empty; 

       foreach (int i in idx) 
       {       
        DataGridViewCell firstCell = Prev.Cells[i]; 
        DataGridViewCell secondCell = item.Cells[i]; 

        firstCellText = (firstCell != null && firstCell.Value != null ? firstCell.Value.ToString() : string.Empty); 
        secondCellText = (secondCell != null && secondCell.Value != null ? secondCell.Value.ToString() : string.Empty); 

        if (firstCellText == secondCellText) 
        {       
         secondCell.Style.ForeColor = Color.Transparent; 
        } 
        else 
        { 
         Prev = item; 
         break; 
        } 
       } 
      } 
      else 
      { 
       Prev = item; 
      } 
     } 
    } 

enter image description here

Problemi correlati