web-dev-qa-db-fra.com

Comment fusionner la cellule DataGridView dans Winforms

J'ai quelques données dans une grille qui affiche actuellement comme ceci:

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

Je veux que ça ressemble à ça: 

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

Y a-t-il un moyen de fusionner ces cellules? Comme je l'ai montré, cela résoudra également mon problème.

15
M. Rain

Vous devez d'abord trouver un doublon

Besoin de deux méthodes:

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

en l'occurrence, peinture cellulaire:

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

maintenant en format de cellule:

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

et dans form_load:

dataGridView1.AutoGenerateColumns = false;

Image of DGV_Merge

32
ghasem deh

Le contrôle DataGridView n'a pas de propriétés ni de méthodes associées pour fusionner des cellules, mais vous pouvez accomplir la même chose en utilisant un dessin personnalisé. Vous pouvez utiliser DataGridView.CellPainting event ou substituer la méthode Paint.

De plus, vous devrez remplacer DataGridView.CellClick, CellEnter, CellFormatting et d'autres méthodes afin de donner à votre DataGridView une fonctionnalité complète. Pour, par exemple, un clic de cellule, la cellule fusionnée entière (ou le groupe de cellules constituant une cellule fusionnée) devra être personnalisée. 

Vous pouvez trouver un exemple de code ici: 

http://social.msdn.Microsoft.com/forums/fr/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

5
Aseem Gautam

Il y a quelques bonnes réponses sur asp.net mais dans Winforms et pour cet exemple (fusion des mêmes données dans des colonnes), il n'est pas défini.

Vous pouvez utiliser color.transparent pour masquer les mêmes valeurs dans datagridview . Même par ce code, les mêmes lignes ne sont pas supprimées et peuvent s'avérer utiles pour les calculs mathématiques . Même vous pouvez définir les colonnes à fusionner en fonction du tri souhaité .

De cette façon, si la fin de "A" était "A4" et que le début de "B" était également "A4", celles-ci ne seraient pas fusionnées. ce qui est souvent plus désiré. (Si vous ne le souhaitez pas, utilisez mieux les autres réponses)

MergeGridviewCells (DGV, nouveau int [] {0,1}); // Par exemple, si vous souhaitez fusionner les premières colonnes data/puis la troisième colonne, puis la deuxième colonne, vous pouvez utiliser 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;
            }
        }
     }

Aperçu:

 enter image description here

1
Ehsan R