2013-05-27 15 views
12

mam pewne dane w sieci, które są aktualnie wyświetlane tak:Jak Scalanie DataGridView komórka w WinForm

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

Chcę, aby wyglądać tak:

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

Czy istnieje jakiś sposób, że mogę scalić te komórki? Próbowałem na wiele sposobów również google, ale nie znalazłem żadnego odpowiedniego sposobu. Jeśli to możliwe, wyświetlanie tych danych w inny sposób bez użycia datagridview, ale wynik jest taki, jaki pokazałem, to również rozwiąże mój problem.

Odpowiedz

5

Kontrolka DataGridView nie ma powiązanych właściwości ani metod scalania komórek, ale można to zrobić za pomocą niestandardowego obrazu. Można użyć zdarzenia DataGridView.CellPainting lub przesłonić metodę Paint.

Ponadto konieczne będzie zastąpienie metod DataGridView.CellClick, CellEnter, CellFormatting i innych metod w celu zapewnienia pełnej funkcjonalności DataGridView. Na przykład w przypadku kliknięcia komórki, cała scalona komórka (lub grupa komórek, które stanowią scaloną komórkę) będzie musiała być niestandardowo malowana.

można znaleźć przykładowy kod tutaj:

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

Najpierw trzeba znaleźć zduplikowane wartości

Potrzeba dwóch metod:

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

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

teraz formatowania komórek:

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

i Form_Load:

dataGridView1.AutoGenerateColumns = false; 

Image of DGV_Merge

+0

doskonałą pracę. – user2211290

+1

Dobra robota! możesz mi pomóc, jak mogę zrobić scalanie kolumn, chcę pojedynczy element span w wielu kolumnach – robot

0

Istnieje kilka dobrych odpowiedzi na asp.net, ale w winformach i dla tego przykładu (łączenie tych samych danych w kolumnach) nie jest zdefiniowane.

Możesz użyć color.transparent, aby ukryć te same wartości w datagridview. nawet według tego kodu, te same wiersze nie są usuwane i mogą być dobre do obliczeń matematycznych. nawet ty możesz zdefiniować kolumny do scalenia według pożądanego sortowania.

W ten sposób, jeśli koniec "A" był "A4", a także początek "B" był "A4", to te nie byłyby scalone. co jest często bardziej pożądane.(Jeśli nie chcesz tego, lepiej użyj innych odpowiedzi)

MergeGridviewCells (DGV, nowy int [] {0,1}); // Na przykład, jeśli chcesz połączyć pierwsze kolumny danych/następnie 3 kolumnę, a następnie druga kolumna można użyć 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

Powiązane problemy