Gibt es eine Möglichkeit, das DataGrid-Steuerelement zum Rendern der tbody und thead HTML-Elemente zu erhalten?ASP.NET 2.0 - DataGrid mit tbody/thead
Antwort
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.
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
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 ... –
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
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
Eine Javascript-Lösung Nice one! –
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);
}
}
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; ' –
@JohnAlters Wie können wir diese Klasse in bestehenden
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
- 1. Datenraster in asp.net 2.0
- 2. asp.net datagrid Sortierung
- 3. .net 2.0 Datagrid Ansicht Combobox Windows-Anwendung
- 4. Crystal Reports + Asp.net 2.0
- 5. GridView in ASP.NET 2.0
- 6. Asp.Net 2.0 Datei-Upload
- 7. ASP.NET DataGrid und HoverMenu Extender
- 8. JSON mit ASP.NET 2.0 VB.NET lesen?
- 9. JQGrid DataUrl Verwendung mit ASP.net (MVC 2.0)
- 10. Mit Bit.ly API in ASP.NET 2.0
- 11. Erstellen einer SOAP-Anfrage mit ASP.Net 2.0
- 12. Asp.net Identity 2.0 Update-Benutzer
- 13. ASP.NET 2.0 Website erhält ThreadAbortException
- 14. Asp.net 2.0 und C# 3.0?
- 15. ASP.NET 2.0 JQuery AJAX Login
- 16. ASP.NET MVC - Ninject 2.0 Aktivierungsfehler
- 17. Erweitern von ASP.NET Identity 2.0
- 18. Einstellung Standardschaltfläche in asp.net 2.0
- 19. Ausnahme nach ASP.NET Identity 2.0
- 20. ASp.net Rollenmanagement in Identity 2.0
- 21. Ninject und ASP.NET Identity 2.0
- 22. Deaktivieren von ASP.Net 2.0-Webereignissen
- 23. Gridview-Spaltenbreite in ASP.NET 2.0
- 24. ASP.NET MVC 2.0 Übersicht Informationen?
- 25. ASP.NET MVC 2.0 Sitzungsstatus Verbindungsfehlerbehandlung
- 26. Silverlight asp.net WCF-Authentifizierung 2.0
- 27. Unterschied zwischen Datagrid und Gridview
- 28. Wie Stored Procedures verwenden w/ASP.NET Datagrid
- 29. ASP.Net, Datagrid: Renderspalte unterschiedlich basierend auf Wert?
- 30. So löschen Sie ein ASP.NET-Datagrid?
Das tut Gridview, aber nicht DataGrid. –
Das ist nur eine Idee. Äquivalent zu "Use Control Adapters", aber mit Beispielen. Weil dieses Paket offene Quellen ist. Nicht mehr. –