2009-03-26 13 views
4

Ich versuche, eine neue Headerrow zu einem Gridview hinzuzufügen. Diese Zeile sollte unterhalb der ursprünglichen Kopfzeile erscheinen.Hinzufügen Gridview Row AFTER Header

Soweit ich weiß, dass ich zwei Veranstaltungen zur Auswahl:

1.) Gridview_RowDataBound 2.) Gridview_RowCreated

Option 1 keine Option, da das Netz ist nicht die Daten über jede Bindung Postback. Option 2 funktioniert nicht wie erwartet. Ich kann die Zeile hinzufügen, aber es wird vor der HeaderRow hinzugefügt, da die HeaderRow selbst in diesem Fall noch nicht hinzugefügt wurde ...

Bitte helfen Sie, danke!

Code: (InnerTable Eigenschaft wird durch individuelle gridview ausgesetzt) ​​

Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 
    If e.Row.RowType = DataControlRowType.Header Then 
     Dim r As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal) 

     For Each c As DataControlField In CType(sender, GridView).Columns 
      Dim nc As New TableCell 
      nc.Text = c.AccessibleHeaderText 
      nc.BackColor = Drawing.Color.Cornsilk 
      r.Cells.Add(nc) 
     Next 

     Dim t As Table = GridView1.InnerTable 
     t.Controls.Add(r) 
    End If 
End Sub 
+0

Nein, das funktioniert nicht. Gleiches Problem wie bei Option 1 in meiner ersten Frage ... – Ropstah

+0

ist der Code in Ihrer Antwort der richtige Code? Ich habe das gleiche Problem. – Eric

+0

Ich habe es geschafft zu arbeiten ... In meinem Fall musste ich die CreateRow-Funktion kennen, mit der ich die benötigte Funktionalität aufbauen konnte. Viel Glück. – Ropstah

Antwort

3

Da dies eine benutzerdefinierte GridView ist, warum nicht erwägen Sie, die CreateChildCont zu überschreiben Rols-Methode?

D.h. (sorry, C#):

protected override void CreateChildControls() 
{ 
    base.CreateChildControls(); 

    if (HeaderRow != null) 
    { 
     GridViewRow header = CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal); 
     for (int i = 0; i < Columns.Count; i++) 
     { 
      TableCell cell = new TableCell(); 
      cell.Text = Columns[i].AccessibleHeaderText; 
      cell.ForeColor = System.Drawing.Color.Black; 
      cell.BackColor = System.Drawing.Color.Cornsilk; 
      header.Cells.Add(cell); 
     } 

     Table table = (Table)Controls[0]; 
     table.Rows.AddAt(1, header); 
    } 
} 

UPDATE Wie Ropstah erwähnt wurde, die Sniplet oben funktioniert nicht mit Paginierung auf. Ich habe den Code in eine PrepareControlHierarchy verschoben und funktioniert nun ordnungsgemäß mit Paginierung, Auswahl und Sortierung.

protected override void PrepareControlHierarchy() 
{ 
    if (ShowHeader && HeaderRow != null) 
    { 
     GridViewRow header = CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal); 
     for (int i = 0; i < Columns.Count; i++) 
     { 
      TableCell cell = new TableCell(); 
      cell.Text = Columns[i].AccessibleHeaderText; 
      cell.ForeColor = System.Drawing.Color.Black; 
      cell.BackColor = System.Drawing.Color.Cornsilk; 
      header.Cells.Add(cell); 
     } 

     Table table = (Table)Controls[0]; 
     table.Rows.AddAt(1, header); 
    } 

    //it seems that this call works at the beginning just as well 
    //but I prefer it here, since base does some style manipulation on existing columns 
    base.PrepareControlHierarchy(); 
} 
+0

Btw, dieses Sniplet funktioniert - ich habe es getestet. – Ruslan

+0

Ich muss widersprechen, es scheint zunächst zu funktionieren, aber wenn Sie Paging/Auswahl aktivieren, erhalten Sie unerwünschte Ergebnisse. 1.) Paging macht die Reihe verschwinden. 2.) Durch Auswählen wird die Zeile wieder angezeigt, aber der Zelleninhalt ist der der ersten Datenzeile, nicht der zugängliche Headertext ... – Ropstah

+0

Sie haben Recht. Ich habe nicht mit Paginierung und Auswahl getestet. Guter Fang. Es wird interessant sein zu sehen, wohin es gehen soll. – Ruslan

0

die Sie interessieren, wenn Sie die Zeile an den InnerTable hinzufügen:

t.Controls.AddAt(1, r) 

Hier ist ein schneller Basistest ich tat, was scheint funktioniert OK:

Protected Sub gridview_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles gridview.DataBound 
    Dim g As GridView = CType(sender, GridView) 

    Dim r As New GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal) 
    Dim th As New TableHeaderCell() 
    th.ColumnSpan = g.Columns.Count 
    th.Text = "This is my new header" 
    r.Cells.Add(th) 

    Dim t As Table = CType(g.Controls(0), Table) 
    t.Rows.AddAt(1, r) 
End Sub 
+0

Nein, das funktioniert nicht, dasselbe Problem wie bei Option 1 in meiner anfänglichen Frage ... – Ropstah

3

Gute Arbeit Jungs, habe ich Ihre Technik für die Gruppierung meine AJAX aktiviert Gridview, und ich für eine lange, lange Zeit gesucht. Prost.

protected override void PrepareControlHierarchy() 
{ 
    if (GroupColumns) 
    { 
     #region Group Column 

     Table table = (Table)Controls[0]; 

     string lastValue = string.Empty; 
     foreach (GridViewRow gvr in this.Rows) 
     { 
      string currentValue = gvr.Cells[GroupColumnIndex].Text; 

      if (lastValue.CompareTo(currentValue) != 0) 
      { 
       // there's been a change in value in the sorted column 
       int rowIndex = table.Rows.GetRowIndex(gvr); 

       // Add a new sort header row 
       GridViewRow sortRow = new GridViewRow(rowIndex, rowIndex, DataControlRowType.DataRow, DataControlRowState.Normal); 

       TableCell sortCell = new TableCell(); 
       TableCell blankCell = new TableCell(); 

       sortCell.ColumnSpan = this.Columns.Count - 1; 
       sortCell.Text = string.Format("{0}", currentValue); 

       blankCell.CssClass = "group_header_row"; 
       sortCell.CssClass = "group_header_row"; 

       // Add sortCell to sortRow, and sortRow to gridTable 
       sortRow.Cells.Add(blankCell); 
       sortRow.Cells.Add(sortCell); 
       table.Controls.AddAt(rowIndex, sortRow); 

       // Update lastValue 
       lastValue = currentValue; 
      } 
     } 

     #endregion 
    } 

    HideColumns(); 

    base.PrepareControlHierarchy(); 
} 
+0

danke für den Austausch :) – Ropstah