2009-02-18 3 views

ответ

0

У DataGrid нет встроенного встроенного программного обеспечения для удовлетворения ваших потребностей. Взгляните на ASP.NET 2.0 CSS Friendly Control Adapters 1.0, они имеют встроенную поддержку DataView, но, похоже, вы можете легко принять эту идею для DataGrid.

+0

Это делает gridview, но не datagrid. –

+0

Это всего лишь идея. Эквивалент «Использовать управляющие адаптеры», но с образцами. Потому что этот пакет является открытым исходным кодом. Не более. –

0

Правильно, похоже, что сетка данных не поддерживает это из коробки, поэтому мне пришлось создать класс, который наследуется от DataGrid. После того, как DataGrid предоставил, я затем анализирую HTML и вставляю элементы в нужное место.

Прилагается мой класс для тех, кто хочет знать, как это сделать. Это быстрый и грязный подход, поэтому я могу предложить лучшие идеи.


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

Извините, но мне не нравится это решение. Например, это зависит от используемого HtmlWriter. С UpperCaseHtmlWriter ваше решение не будет работать. Также код с MemoryStream ... Также HtmlTextWriter ... –

+0

Не могли бы вы объяснить далее? Метод Render элемента управления запускает HtmlTextWriter как вход, он находится в определении! Каково ваше возражение против MemoryStream и т. Д. – Ady

3

Это можно сделать также с помощью javascript.

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

Затем вы должны вызвать эту функцию OnLoad тела, как, что:

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

Источник: http://www.codeproject.com/KB/grid/HeaderOnEachPage.aspx

+0

Решение для javascript Nice one! –

8

Хотя мне нравится ответ на "user186197", что блог использует отражение, вещи может пойти не так, как в не-полностью доверенных средах хостинга. Вот что мы используем, никаких хаков:

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

Мне нравится это решение с несколькими незначительными изменениями: 'if (this.ShowHeader) table.Rows [0] .TableSection = TableRowSection.TableHeader;' и 'if (this.ShowFooter) table.Rows [table.Rows.Count - 1] .TableSection = TableRowSection.TableFooter; ' –

+0

@JohnAllers, как мы можем использовать этот класс в существующем , можете ли вы описать меня ..? –

+2

Несмотря на то, что этот ответ работает, и я очень благодарен за это, это тот материал, который заставил меня замолчать о веб-формах и в конце концов подтолкнул меня к MVC. – akousmata