it-swarm.com.de

So fügen Sie DataGridView-Zellen in Winforms zusammen

Ich habe einige Daten in einem Raster, das aktuell wie folgt angezeigt wird:

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

Ich möchte es so aussehen lassen: 

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

Gibt es eine Möglichkeit, diese Zellen zusammenzuführen? Ich habe in vielerlei Hinsicht auch Google versucht, aber keinen geeigneten Weg gefunden. Wenn es möglich ist, diese Daten auf andere Weise anzuzeigen, ohne Datagridview zu verwenden, ist das Ergebnis das Ergebnis So wie ich es gezeigt habe, wird das auch mein Problem lösen.

15
M. Rain

Sie müssen zuerst doppelte Werte finden

Benötigen Sie zwei Methoden:

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

im Falle von Zellpainting:

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

jetzt in der Zellenformatierung:

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

und in form_load:

dataGridView1.AutoGenerateColumns = false;

Image of DGV_Merge

32
ghasem deh

Das DataGridView-Steuerelement verfügt nicht über verwandte Eigenschaften oder Methoden zum Zusammenführen von Zellen. Sie können dies jedoch auch mit benutzerdefinierten Bemalungen durchführen. Sie können DataGridView.CellPainting event verwenden oder die Paint-Methode überschreiben.

Außerdem müssen Sie DataGridView.CellClick, CellEnter, CellFormatting und andere Methoden außer Kraft setzen, um Ihrem DataGridView eine umfassende Funktionalität zu verleihen. Bei einem Klicken auf die Zelle muss beispielsweise die gesamte verbundene Zelle (oder eine Gruppe von Zellen, aus denen eine verbundene Zelle besteht) individuell bemalt werden. 

Hier finden Sie einige Beispielcodes: 

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

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

http://www.codeproject.com/Questions/152113/Wie kann man-i-merge-DataGridView-Rows-Cells-mit-Equal

5
Aseem Gautam

Es gibt einige gute Antworten auf asp.net, aber in winforms und für dieses Beispiel (das Zusammenführen derselben Daten in Spalten) ist es nicht definiert.

Sie können color.transparent verwenden, um die gleichen Werte in datagridview . Auszublenden. Dieselben Zeilen werden nicht gelöscht und können für matematische Berechnungen verwendet werden .

Auf diese Weise wäre das Ende von "A" "A4" und der Beginn von "B" war "A4". Das ist oft mehr erwünscht. (Wenn Sie dies nicht möchten, verwenden Sie besser andere Antworten.)

MergeGridviewCells (DGV, new int [] {0,1}); // Wenn Sie zum Beispiel die ersten Spalten mit Daten/dann die 3. und dann die zweite Spalte zusammenführen möchten, können Sie new int [] {0,2,1} verwenden. 

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

Vorschau:

 enter image description here

1
Ehsan R