2013-05-27 36 views
12

Tôi có một số dữ liệu trong một mạng lưới hiện sẽ hiển thị như thế này:Làm thế nào để Merge DataGridView di động trong 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  | 
------------------ 

Tôi muốn làm cho nó trông như thế này:

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

Có cách nào rằng tôi có thể hợp nhất các tế bào này? Tôi đã thử nhiều cách nhưng cũng không tìm được cách phù hợp. Nếu có thể hiển thị dữ liệu này theo cách khác mà không sử dụng datagridview nhưng kết quả là cách tôi đã cho thấy, điều đó cũng sẽ giải quyết được vấn đề của tôi.

Trả lời

5

Điều khiển DataGridView không có thuộc tính hoặc phương pháp liên quan để hợp nhất ô, nhưng bạn có thể thực hiện tương tự bằng cách sử dụng tùy chỉnh vẽ. Bạn có thể sử dụng sự kiện DataGridView.CellPainting hoặc ghi đè phương thức Paint.

Ngoài ra, bạn sẽ cần phải ghi đè DataGridView.CellClick, CellEnter, CellFormatting và các phương pháp khác để cung cấp cho DataGridView một chức năng đầy đủ tính năng của bạn. Ví dụ: trên lần nhấp vào ô, toàn bộ ô được hợp nhất (hoặc nhóm ô tạo thành một ô được hợp nhất) sẽ phải được tùy chỉnh vẽ.

Bạn có thể tìm thấy một số mẫu mã ở đây:

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

Trước tiên, bạn phải tìm một bản sao giá trị

cần hai phương pháp:

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

trong sự kiện này, 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; 
    } 
} 

bây giờ trong định dạng tế bào:

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

và trong Form_Load:

dataGridView1.AutoGenerateColumns = false; 

Image of DGV_Merge

+0

xuất sắc công việc. – user2211290

+1

Làm tốt lắm! bạn có thể giúp tôi làm thế nào tôi có thể làm việc sáp nhập cột, tôi muốn span phần tử duy nhất trên nhiều cột – robot

0

Có một số phản ứng tốt trên asp.net nhưng trong winforms và cho ví dụ này (sáp nhập cùng một dữ liệu trong cột) nó không được xác định.

Bạn có thể sử dụng color.transparent để ẩn các giá trị giống nhau trong chế độ xem dữ liệu. thậm chí bằng mã này, các hàng giống nhau không bị xóa và có thể tốt cho các tính toán báo cáo. thậm chí bạn có thể xác định cột nào sẽ hợp nhất theo loại mong muốn của bạn.

Bằng cách này nếu kết thúc "A" là "A4" và cũng bắt đầu "B" là "A4", những thứ đó sẽ không hợp nhất. thường là mong muốn hơn.(Nếu bạn không muốn điều này, hãy sử dụng các phản hồi khác tốt hơn)

MergeGridviewCells (DGV, new int [] {0,1}); // Ví dụ: nếu bạn muốn hợp nhất dữ liệu cột đầu tiên/sau đó cột thứ 3 và sau đó cột thứ hai bạn có thể sử dụng 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

Các vấn đề liên quan