2014-06-30 41 views
6

Desidero raggruppare le righe che hanno lo stesso nome in DataGridView in Windows Form di seguito è l'immagine che voglio implementare.Righe di gruppo in DataGridView

È possibile implementare di seguito senza utilizzare alcun strumento di terze parti?

sample

+0

No, non c'è modo di fare questo facilmente con il controllo standard. – MoonKnight

+0

@ Killercam: sì, anche io non ho trovato alcuna soluzione. – Deeps

risposta

3

Si potrebbe provare a utilizzare la funzionalità di struttura MergeCells di MSFlexGrid della cella verticale fusione anziché fila raggruppamenti come spiegato in questo articolo DataGridView Grouping in C#/VB.NET: Two Recipes. In questo esempio, le righe che appartengono a un gruppo vengono unite visivamente utilizzando celle unite verticalmente, invece di utilizzare classiche righe di gruppo orizzontali.

enter image description here

protected override void OnCellPainting(DataGridViewCellPaintingEventArgs args) 
{ 
    base.OnCellPainting(args); 

    args.AdvancedBorderStyle.Bottom = 
    DataGridViewAdvancedCellBorderStyle.None; 

    // Ignore column and row headers and first row 
    if (args.RowIndex < 1 || args.ColumnIndex < 0) 
    return; 

    if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex)) 
    { 
    args.AdvancedBorderStyle.Top = 
     DataGridViewAdvancedCellBorderStyle.None; 
    } 
    else 
    { 
    args.AdvancedBorderStyle.Top = AdvancedCellBorderStyle.Top; 
    } 
} 
+1

Penso che stiamo creando un'illusione solo rimuovendo il confine. – Deeps

+1

Ma non è quello che vuoi ottenere senza utilizzare librerie/controlli di terze parti? – chridam

+0

sì, voglio fare lo stesso, ma dopo questo. Voglio mettere una casella per controllare tutti gli stessi articoli del gruppo ed eseguire qualche operazione. quindi questa non è la soluzione, anche se hai ragione possiamo avere lo stesso aspetto di visualizzazione nell'immagine. Grazie per l'aiuto .. :) – Deeps

3

nel posto DataGridView il seguente codice nel

dgvProduct_CellFormatting Event 

If e.RowIndex > 0 And e.ColumnIndex = 0 Then 
       If dgvProduct.Item(0, e.RowIndex - 1).Value = e.Value Then 
        e.Value = "" 
       ElseIf e.RowIndex < dgvProduct.Rows.Count - 1 Then 
        dgvProduct.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.White 
       End If 
End If 

Tutto fatto!

Godetevi

enter image description here

0

Per completare la risposta (scelta), ecco il codice completo. L'idea non menzionata è una classe che estende la classe DataGridView.

public class GroupByGrid : DataGridView 
    { 

     protected override void OnCellFormatting(
      DataGridViewCellFormattingEventArgs args) 
     { 
      // Call home to base 
      base.OnCellFormatting(args); 

      // First row always displays 
      if (args.RowIndex == 0) 
       return; 


      if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex)) 
      { 
       args.Value = string.Empty; 
       args.FormattingApplied = true; 
      } 
     } 

     private bool IsRepeatedCellValue(int rowIndex, int colIndex) 
     { 
      DataGridViewCell currCell = 
       Rows[rowIndex].Cells[colIndex]; 
      DataGridViewCell prevCell = 
       Rows[rowIndex - 1].Cells[colIndex]; 

      if ((currCell.Value == prevCell.Value) || 
       (currCell.Value != null && prevCell.Value != null && 
       currCell.Value.ToString() == prevCell.Value.ToString())) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     protected override void OnCellPainting(
      DataGridViewCellPaintingEventArgs args) 
     { 
      base.OnCellPainting(args); 

      args.AdvancedBorderStyle.Bottom = 
       DataGridViewAdvancedCellBorderStyle.None; 

      // Ignore column and row headers and first row 
      if (args.RowIndex < 1 || args.ColumnIndex < 0) 
       return; 

      if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex)) 
      { 
       args.AdvancedBorderStyle.Top = 
        DataGridViewAdvancedCellBorderStyle.None; 
      } 
      else 
      { 
       args.AdvancedBorderStyle.Top = AdvancedCellBorderStyle.Top; 
      } 
     } 
    } 

source per gentile concessione di social.msdn.microsoft

Problemi correlati