2009-02-18 4 views

Antwort

0

DataGrid verfügt nicht über integrierte Funktionen, um Ihre Anforderungen zu erfüllen. Werfen Sie einen Blick auf ASP.NET 2.0 CSS Friendly Control Adapters 1.0 sie haben integrierte Unterstützung für DataView, aber Sie können diese Idee für DataGrid leicht übernehmen.

+0

Das tut Gridview, aber nicht DataGrid. –

+0

Das ist nur eine Idee. Äquivalent zu "Use Control Adapters", aber mit Beispielen. Weil dieses Paket offene Quellen ist. Nicht mehr. –

0

Richtig, sieht so aus, als ob das Datenraster das nicht unterstützt, also musste ich eine Klasse erstellen, die vom DataGrid erbt. Nachdem das DataGrid gerendert wurde, parse ich den HTML und injiziere die Elemente an der richtigen Stelle.

Attached ist meine Klasse für diejenigen, die wissen wollen wie. Das ist eine schnelle und schmutzige Herangehensweise, also bin ich willkommen zu besseren Ideen.


Imports System.IO 
Imports System.Text 

Public Class TestDataGrid 
    Inherits System.Web.UI.WebControls.DataGrid 

    Private sTHeadClass As String = String.Empty 
    Private sTBodyClass As String = String.Empty 
    Private sTFootClass As String = String.Empty 

#Region " Properties " 

    Public Property THeadClass() As String 
    Get 
     Return sTHeadClass 
    End Get 
    Set(ByVal value As String) 
     sTHeadClass = value 
    End Set 
    End Property 

    Public Property TBodyClass() As String 
    Get 
     Return sTBodyClass 
    End Get 
    Set(ByVal value As String) 
     sTBodyClass = value 
    End Set 
    End Property 

    Public Property TFootClass() As String 
    Get 
     Return sTFootClass 
    End Get 
    Set(ByVal value As String) 
     sTFootClass = value 
    End Set 
    End Property 

#End Region 

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 

    Dim oMemoryStream As New MemoryStream() 
    Dim oStreamWriter As New StreamWriter(oMemoryStream) 
    Dim oStreamReader As New StreamReader(oMemoryStream) 
    Dim oHtmlTextWriter As New HtmlTextWriter(oStreamWriter) 

    MyBase.Render(oHtmlTextWriter) 

    oHtmlTextWriter.Flush() 

    oMemoryStream.Flush() 
    oMemoryStream.Position = 0 

    Dim sHtml As String = oStreamReader.ReadToEnd() 
    Dim oHtml As New Text.StringBuilder() 

    Dim iPastIndex As Integer = 0 
    Dim iIndex As Integer = sHtml.IndexOf("<tr>") 

    oHtml.Append(sHtml.Substring(iPastIndex, iIndex - iPastIndex)) 

    iPastIndex = iIndex 

    If ShowHeader Then 
     WriteElementStart(oHtml, "thead", sTHeadClass) 

     'Write Header Row 
     iIndex = sHtml.IndexOf("</tr>", iPastIndex) + 5 
     oHtml.Append(sHtml.Substring(iPastIndex, iIndex - iPastIndex)) 
     iPastIndex = iIndex 

     oHtml.Append("</thead>") 
     WriteElementStart(oHtml, "tbody", sTBodyClass) 
    Else 
     WriteElementStart(oHtml, "tbody", sTBodyClass) 
    End If 

    If ShowFooter Then 

     'Writer Body Rows 
     iIndex = sHtml.LastIndexOf("<tr>") 
     oHtml.Append(sHtml.Substring(iPastIndex, iIndex - iPastIndex)) 
     iPastIndex = iIndex 

     WriteElementEnd(oHtml, "tbody") 
     WriteElementStart(oHtml, "tfoot", sTFootClass) 

     'Write Footer Row 
     iIndex = sHtml.LastIndexOf("</table>") 
     oHtml.Append(sHtml.Substring(iPastIndex, iIndex - iPastIndex)) 
     iPastIndex = iIndex 

     WriteElementEnd(oHtml, "tfoot") 

    Else 
     iIndex = sHtml.LastIndexOf("</table>") 
     oHtml.Append(sHtml.Substring(iPastIndex, iIndex - iPastIndex)) 
     iPastIndex = iIndex 

     WriteElementEnd(oHtml, "tbody") 
    End If 

    oHtml.Append(sHtml.Substring(iPastIndex, sHtml.Length - iPastIndex)) 

    writer.Write(oHtml.ToString()) 
    End Sub 

    Private Sub WriteElementStart(ByVal Builder As StringBuilder, ByVal Tag As String, ByVal CssClass As String) 
    If String.IsNullOrEmpty(CssClass) Then 
     Builder.AppendFormat("<{0}>", Tag) 
    Else 
     Builder.AppendFormat("<{0} class='{1}'>", Tag, CssClass) 
    End If 
    End Sub 

    Private Sub WriteElementEnd(ByVal Builder As StringBuilder, ByVal Tag As String) 
    Builder.AppendFormat("</{0}>", Tag) 
    End Sub 

End Class 
+0

Sorry, aber ich mag diese Lösung nicht. Zum Beispiel hängt es von HtmlWriter ab. Mit UpperCaseHtmlWriter wird Ihre Lösung nicht funktionieren. Auch Code mit MemoryStream ... Auch HtmlTextWriter ... –

+0

Könnten Sie bitte weiter erklären? Die Render-Methode der Steuerung verwendet einen HtmlTextWriter als Eingabe, sie ist in der Definition enthalten! Was ist Ihr Einwand gegen MemoryStream, etc. – Ady

3

Es kann auch über Javascript erfolgen.

function AddTHEAD(tableName) 
{ 
    var table = document.getElementById(tableName); 
    if(table != null) 
    { 
    var head = document.createElement("THEAD"); 
    head.style.display = "table-header-group"; 
    head.appendChild(table.rows[0]); 
    table.insertBefore(head, table.childNodes[0]); 
    } 
} 

Dann müssen Sie diese Funktion auf Körper onload nennen wie folgt aus:

<body onload="javascript: AddTHEAD('DataGridId')"> 

Quelle: http://www.codeproject.com/KB/grid/HeaderOnEachPage.aspx

+0

Eine Javascript-Lösung Nice one! –

8

Während ich die Antwort von "user186197" mögen, dass Blog-Post Reflexion verwendet, Dinge möglicherweise in nicht vollständig vertrauenswürdigen Hosting-Umgebungen fehlschlagen. Hier ist, was wir verwenden, keine Hacks:

public class THeadDataGrid : System.Web.UI.WebControls.DataGrid 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     this.UseAccessibleHeader = true; //to make sure we render TH, not TD 

     Table table = Controls[0] as Table; 

     if (table != null && table.Rows.Count > 0) 
     { 
      table.Rows[0].TableSection = TableRowSection.TableHeader; 
      table.Rows[table.Rows.Count - 1].TableSection = TableRowSection.TableFooter; 
     } 

     base.OnPreRender(e); 
    } 
} 
+0

Ich mag diese Lösung mit ein paar kleinen Änderungen: 'if (this.ShowHeader) table.Rows [0] .TableSection = TableRowSection.TableHeader;' und 'if (this.ShowFooter) table.Rows [table.Rows.Count - 1] .TableSection = TableRowSection.TableFooter; ' –

+0

@JohnAlters Wie können wir diese Klasse in bestehenden verwenden, können Sie mich beschreiben ..? –

+2

Während diese Antwort funktioniert und ich es sehr schätze, ist das der Stoff, der mich über Webforms verrückt machte und mich schließlich zu MVC drängte. – akousmata