Есть ли способ получить элемент управления DataGrid для визуализации объектов tbody и thead HTML?ASP.NET 2.0 - DataGrid с tbody/thead
ответ
У DataGrid нет встроенного встроенного программного обеспечения для удовлетворения ваших потребностей. Взгляните на ASP.NET 2.0 CSS Friendly Control Adapters 1.0, они имеют встроенную поддержку DataView, но, похоже, вы можете легко принять эту идею для DataGrid.
Правильно, похоже, что сетка данных не поддерживает это из коробки, поэтому мне пришлось создать класс, который наследуется от 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
Извините, но мне не нравится это решение. Например, это зависит от используемого HtmlWriter. С UpperCaseHtmlWriter ваше решение не будет работать. Также код с MemoryStream ... Также HtmlTextWriter ... –
Не могли бы вы объяснить далее? Метод Render элемента управления запускает HtmlTextWriter как вход, он находится в определении! Каково ваше возражение против MemoryStream и т. Д. – Ady
Это можно сделать также с помощью 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
Решение для javascript Nice one! –
Хотя мне нравится ответ на "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);
}
}
Мне нравится это решение с несколькими незначительными изменениями: 'if (this.ShowHeader) table.Rows [0] .TableSection = TableRowSection.TableHeader;' и 'if (this.ShowFooter) table.Rows [table.Rows.Count - 1] .TableSection = TableRowSection.TableFooter; ' –
@JohnAllers, как мы можем использовать этот класс в существующем
Несмотря на то, что этот ответ работает, и я очень благодарен за это, это тот материал, который заставил меня замолчать о веб-формах и в конце концов подтолкнул меня к MVC. – akousmata
- 1. ASP.NET 2.0 Вложенные Datagrid?
- 2. Таблица данных в asp.net 2.0
- 3. asp.net datagrid
- 4. WPF + XAML + DataGrid + Powershell 2.0
- 5. ASP.NET Identity 2.0 с ASP.NET MVC 2
- 6. xamarin с идентификатором asp.net 2.0
- 7. ASP.NET DataGrid в Repeater
- 8. ASP.NET: Datagrid CurrentRow
- 9. asp.net datagrid sorting
- 10. ASP.NET Datagrid: как стиль?
- 11. ASP.NET C# Datagrid hyperlinks
- 12. ASP.NET DataGrid Dropdown Выпуск
- 13. asp.net DataGrid Редактировать
- 14. Создать вложенные флажки в asp.net 2.0
- 15. ASP.NET DataGrid Header Width
- 16. asp.net dropdown iniside datagrid
- 17. Как очистить datagrid ASP.NET?
- 18. ASP.NET DataGrid annoyance
- 19. C# ASP.NET DataGrid Флажок
- 20. Вложенные DataGrid в .NET Compact Framework 2.0?
- 21. Silverlight 2.0 DataGrid Как удалить эффект mouseover
- 22. forum in asp.net 2.0
- 23. Как экспортировать Silverlight 2.0 DataGrid в html?
- 24. Ошибка ASP.NET 2.0 InterlockedIncrement
- 25. ASP.NET 2.0 Настройка IIS
- 26. Многопоточность на ASP.NET 2.0
- 27. Расширение ASP.NET Identity 2.0
- 28. ConnectionString в asp.net 2.0
- 29. Локализовать приложение ASP.NET 2.0
- 30. ASP.NET 2.0 или 3.5?
Это делает gridview, но не datagrid. –
Это всего лишь идея. Эквивалент «Использовать управляющие адаптеры», но с образцами. Потому что этот пакет является открытым исходным кодом. Не более. –