2016-06-10 11 views
1

Zuerst von Ich weiß nicht, ob das möglich ist, der richtige Weg zu gehen oder sogar funktioniert, aber ich hoffe, Sie können mir helfen, ich werde versuchen zu erklären:Wie mehrere Spaltenwerte in eine Spalte zusammenführen? Asp.net Gridview C#

I habe ein Gridview-Steuerelement auf der ASPX-Seite:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True" OnRowDataBound="GridView1_RowDataBound" GridLines="None" CssClass="table table-striped" /> 

ich eine Datatable in dem Code-Behind erstellt, die die folgenden Daten und haben binden sie an den Gridview-Steuerelement hält: ich würde jetzt

----------------------------------------- 
|  | Name1 | Name2 | Name3 | Name4 | 
----------------------------------------- 
| Row1 | 1  | 1  | 1  | 1b | 
| Row2 | 1a | 2b | 2b | 4b | 
| Row3 | 2a | 2c | 2a | 2a | 
| Row4 | 1d | 1d | 1d | 4d | 
| Row5 | 1e | 1e | 1e | 1e | 
| Row6 | 1f | 2f | 3f | 4f | 
----------------------------------------- 

mag Übereinstimmende Spaltenwerte, die zusammengeführt werden sollen, und fügen Sie die entsprechenden Werte hinzu iate colspan. Ich habe hinzugefügt, um die Gridview eine OnRowDataBound wie folgt steuern:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if (e.Row.RowIndex >= 0) 
     { 
      int colSpanValue = 2; 
      for (int i = 0; i < e.Row.Cells.Count; i++) 
      { 
       if (i+1 < e.Row.Cells.Count) 
       { 
        if (e.Row.Cells[i].Text == e.Row.Cells[i + 1].Text) 
        { 
         e.Row.Cells[i].BackColor = Color.Beige; 
         e.Row.Cells[i].ColumnSpan = colSpanValue; 
         e.Row.Cells[i].HorizontalAlign = HorizontalAlign.Center; 
         e.Row.Cells[i + 1].Visible = false; 
         colSpanValue++; 
        } 
       } 
      } 
     } 
    } 
} 

so die obigen Daten diesem Thema erhalten möchten, so etwas wie dieses.

----------------------------------------- 
|  | Name1 | Name2 | Name3 | Name4 | 
----------------------------------------- 
| Row1 |  1  | 1b   | <!-- problem 
| Row2 | 1a |  2b  | 4b | 
| Row3 | 2a | 2c |  2a  | <!-- problem 
| Row4 |   1d   | 4d | 
| Row5 |    1e    | 
| Row6 | 1f | 2f | 3f | 4f | 
----------------------------------------- 

Zur Zeit habe ich es geschafft, dies zu erhalten, siehe Screenshot enter image description here

jedoch nicht wirklich, was ich, um zu sehen, möchte aber erwarten würde, wenn der Block OnRowDataBound Code wahrscheinlich nicht das Recht erfolgt.

Also meine Frage ist:

  • Wie kann ich alle gleich Spalten in einer Zeile und fügen Sie colspan sie fusionieren?
  • Jetzt für das knifflige Bit, wäre ich in der Lage, die Spalten so zu sortieren, dass passende Spaltenzellen richtig angezeigt werden? (Nicht sicher über diese)

Also das ideale Ergebnis so sein würde:

----------------------------------------- 
|  | Name1 | Name2 | Name3 | Name4 | 
----------------------------------------- 
| Row1 |   1   | 1b | <!-- problem 
| Row2 | 1a |  2b  | 4b | 
| Row3 | 2a | 2c |  2a  | <!-- problem 
| Row4 |   1d   | 4d | 
| Row5 |    1e    | 
| Row6 | 1f | 2f | 3f | 4f | 
----------------------------------------- 

AKTUELLES

Nach der Aktualisierung des Codes gemäß der bereitgestellten Antworten von ConnorsFan und fnostro, beide Antworten sind korrekt und funktionieren, danke für die Hilfe. Ich wähle für ConnorsFan Ansatz, wie ich noch lerne.

Die collspan ist jetzt richtig sind, siehe Bild unten:

enter image description here

ich des fnostro beraten werden versuchen, den Sortierteil über die Datatable und erneut binden die Daten an die GridView1 zu verwalten und halten Sie auf dem Laufenden . Nochmals vielen Dank für Ihre Antworten.

Antwort

2

Sie können dies versuchen:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     for (int i = 0; i < e.Row.Cells.Count - 1; i++) 
     { 
      TableCell cell = e.Row.Cells[i]; 

      if (cell.Visible) 
      { 
       int colSpanValue = 1; 

       for (int j = i + 1; j < e.Row.Cells.Count; j++) 
       { 
        TableCell otherCell = e.Row.Cells[j]; 

        if (otherCell.Text == cell.Text) 
        { 
         colSpanValue++; 
         otherCell.Visible = false; 
        } 
        else 
        { 
         break; 
        } 
       } 

       if (colSpanValue > 1) 
       { 
        cell.ColumnSpan = colSpanValue; 
        cell.BackColor = Color.Beige; 
        cell.HorizontalAlign = HorizontalAlign.Center; 
       } 
      } 
     } 
    } 
} 
+0

Vielen Dank, das funktioniert großartig, ich habe hinzugefügt, aktualisiert Informationen einschließlich eines Screenshots mit dem Ergebnis Ihrer Antwort. – user6450463

+0

Gern geschehen! – ConnorsFan

0

Sortierung Bezug.Es ist besser, in der Datentabelle zu verwalten Sortieren und einfach anbinden zu Gridview

Hier ist, wie ich das RowDataBound Ereignis wie Daten zu fusionieren geändert:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
     // loop through cells and track span index (si) 
     for (int i = 0, si = 0; i < e.Row.Cells.Count; si = i) 
     { 
      // compare adjacent cells for like data and hide as needed 
      while (++i < e.Row.Cells.Count && e.Row.Cells[ si ].Text == e.Row.Cells[ i ].Text) 
      e.Row.Cells[ i ].Visible = false; 

      // set span and, conditionally, special formatting 
      if ((e.Row.Cells[ si ].ColumnSpan = (i - si)) > 1) 
      { 
      e.Row.Cells[ si ].BackColor = Color.Beige; 
      e.Row.Cells[ si ].HorizontalAlign = HorizontalAlign.Center; 
      } 
     } 
     } 
    } 
+0

Vielen Dank für Ihre Beratung bezüglich der Sortierung der Spalten, ich werde schauen, wie ich das erreichen konnte. – user6450463

+0

Ich bin froh zu helfen. Schau dir 'Linq' an. [Siehe diese SO-Frage] (http://stackoverflow.com/questions/16302901/how-to-sort-datatable-by-two-columns-in-c-sharp) – fnostro

+0

Dies ermöglicht mir nach den Werten innerhalb a zu sortieren Spalten (von oben nach unten) aber würde es eine Möglichkeit geben, die Zeilen zu sortieren, zB: von links nach rechts auf Zeilenebene, wenn Sie sich meine aktualisierten Informationen ansehen und Zeile 3 überprüfen, sehen Sie das folgende Ergebnis: (2a, 2b, 2x2a) Nun möchte ich diese im Idealfall gruppieren, aber nicht sicher, ob dies der richtige Ansatz wäre, da es die gesamte Spalte verschieben würde, aber ich könnte mir vorstellen, dass wenn wir die erste Zeile richtig sortieren und zur zweite Reihe, könnten wir das Ergebnis der ersten Reihe wieder versauen, nicht sicher, ob das funktionieren wird. – user6450463

Verwandte Themen