有沒有辦法讓DataGrid控件呈現tbody和thead HTML元素?ASP.NET 2.0 - 帶有tbody的DataGrid/thead
回答
DataGrid沒有內置的東西來完成您的需求。看看ASP.NET 2.0 CSS Friendly Control Adapters 1.0他們已經內置了對DataView的支持,但似乎你可以很容易地將這個想法用於DataGrid。
好吧,看起來像數據網格不支持這個開箱即用,所以我不得不創建一個繼承自DataGrid的類。在DataGrid呈現I後,然後解析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 ... – 2009-02-18 20:22:53
你能解釋一下嗎?控件的Render方法將HtmlTextWriter作爲輸入,它在定義中!你對MemoryStream有什麼異議? – Ady 2009-02-19 01:52:36
它也可以通過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')">
雖然我喜歡 「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);
}
}
- 1. 帶有oAuth 2.0的Picasa API
- 2. 帶有Code :: Blocks的SDL 2.0
- 3. Symfony 2.0帶有OpenID的FOSUserBundle
- 4. 帶有通用基類的ASP.NET Core 2.0存儲庫模式
- 5. 有沒有人使用帶有播放框架2.0的hazelcast 2.0
- 6. asp.net 2.0核心擁有
- 7. typescript 2.0:帶有默認值的參數
- 8. 帶有失敗響應的Retrofit 2.0
- 9. 帶有PingIdentity的AD FS 2.0/AppFabric Labs ACS
- 10. JSF 2.0和帶有Facelets的Primefaces
- 11. 如何使用帶有Jsf 2.0的Fusioncharts
- 12. 帶有oauth 2.0的Google Reporting API
- 13. RESTKit 2.0:帶有文本/ html的AFHTTPClient
- 14. 帶有maven和子項目的Playframework 2.0
- 15. Asp.net 2.0 VS asp.net V3.5
- 16. 帶有和不帶Telerik的ASP.NET Ajax
- 17. ASP.NET ListView - 渲染THEAD/TBODY標籤
- 18. 帶有IronRuby的ASP.net MVC?
- 19. 帶有DotNetOpenAuth的ASP.NET Web API
- 20. 帶有ASP.NET Core 2.0的Aurelia:無法找到ID爲:resources/index的模塊
- 21. 使用「dotnet new」啓動一個新的帶有標識的ASP.Net Core 2.0項目
- 22. 排序與多個<tbody> jQuery的表分揀機2.0
- 23. 帶有Ajaxcontroltoolkit 1.0和system.web.extensions 1.0的ASP.NET 4.0
- 24. 的ConnectionString在asp.net 2.0
- 25. 可以asp.net有<tbody id =「blah」runat =「server」>?
- 26. Asp.net 2.0路由
- 27. 在asp.net 2.0
- 28. ASP.NET 2.0 FormsAuthentication.RedirectFromLoginPage()
- 29. 在ASP.NET 2.0
- 30. ASP .NET 2.0的ASP.NET MVC 2.0集成
那沒有gridview,但沒有datagrid。 – 2009-02-18 17:24:01
這只是一個想法。相當於「使用控制適配器」,但帶有樣本。因爲這個包是開源的。不多。 – 2009-02-18 17:27:26