我有一个GridView。我希望单元格的内容,实际的细节数据是html编码的。但我希望将原始HTML保留在标题中。
也就是说,这种情况下的标题是语言名称和ISO代码,例如“英语(EN)”。我希望名称和代码分开,所以我将标题指定为“English< br />(EN)”。
但是对于内容,我希望看到任何HTML。如果它说“< p> foobar< / p>”我想要显示p标签。
如果我说“htmlencode = false”,那么标题不会被编码,但数据也不会被编码。
有什么方法可以说,html编码数据,但不是标题?
如果重要,我会在代码中构建列而不是ASP文件中的标记,具体取决于我在数据中找到的语言。所以这就是我创建列的方式:
For Each row As DataRow In ds.Tables(0).Rows
Dim iso2 = row("language")
Dim name = row("name")
... other code ...
Dim head = String.Format("{0}<br/>({1})", name, iso2)
gvSnippets.Columns.Add(New BoundField With {.HeaderText = head, .DataField = iso2, .HtmlEncode = False})
... other code ...
End For
(我的初稿没有设置HtmlEncode。)
好奇的观察:在我的前几次测试运行中,数据不包含任何HTML或实体,标题中的HTML未编码,我得到换行符而不是“&lt; br /&gt;”。然后我做了一个测试,其中数据中有实体,实体得到html编码......标题也是如此。就像ASP一样,显然默认情况下,如果数据没有HTML但标题没有,那么就不要对标题进行HTML编码。但如果数据有HTML,则对数据和标题进行HTML编码。因此,它会动态决定是否对标题进行html编码。
在回复@fnostro时,这是GridView的标记:
<asp:GridView ID="gvSnippets" runat="server" AutoGenerateColumns="False" SkinID="skin3" EmptyDataText="No records found" Visible="false">
</asp:GridView>
没有&lt; Columns&gt;标记。我在代码中完全构建了列。我没有测试是否出现相同的行为,我认为是更正常的情况,你指定带有标记的列。
答案 0 :(得分:0)
将这些代码行添加到循环的开头
row("language") = HttpUtility.HtmlEncode(dr("language"))
row("name") = HttpUtility.HtmlEncode(dr("name"))
答案 1 :(得分:0)
根据我对您帖子中提供的信息的阅读,我有以下建议:
您应该将数据格式与原始数据隔离开来。
您的
decimal vals = 0.1m;
decimal minute = 60m; //both are at the class level
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
//here is where i enabled and started my timer;
//i just dragged a timer over my form in the (design) area
timer1.Enabled = true;
timer1.Start();
list.Add(richTextBox1.Text.ToString());//ignore this line
}
private void timer1_Tick(object sender, EventArgs e)
{
//the tick interval is set to 100
//which is 0.1 seconds
minute = minute - vals;
string aaa = minute.ToString();
label3.Text = aaa;
if (minute == 0)
{
timer1.Stop();
}
}
是GridView的数据源。 DataTable
应该只包含原始数据,完全没有格式化和未掺杂。
DataTable
通过设置GridView DataTable
并调用DataSource
绑定到Gridview。调用DataBind()
将触发与Gridviews相关的所有数据绑定事件,这将允许您:
gvSnippets.Databind()
事件)背后的代码中更复杂的格式。关于GridView标题:RowDataBound
一次出现在Gridview的顶部,并且内部存储在HeaderText
中,而不是每行存储,即使每个绑定字段都有HeaderText属性。
示例摘录gvSnippets每个更新的标记:
GridView.HeaderRow
然后你可以在Code Behind中做这样的事情:
<asp:GridView ID="gvSnippets" runat="server"
AutoGenerateColumns="False" SkinID="skin3"
EmptyDataText="No records found" Visible="false">
</asp:GridView>
附录处理动态单元格
对于定义为:
的GridViewPublic Class __JunkWebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Fill Dataset first, then:
gvSnippets.DataSource = ds.Tables(0)
' Add Columns...
gvSnippets.Columns.Add(...)
gvSnippets.Columns.Add(...)
gvSnippets.Columns.Add(...)
. . .
' This will trigger data binding events
gvSnippets.DataBind();
End Sub
Private Property HeaderTextLanguage As String
Private Property HeaderTextLanguageIso As String
Dim NeedHeaderText As Boolean = False
Private Sub gvSnippets_DataBinding(sender As Object, e As EventArgs) Handles gvSnippets.DataBinding
NeedHeaderText = True
End Sub
Private Sub gvSnippets_DataBound(sender As Object, e As EventArgs) Handles gvSnippets.DataBound
Dim this As GridView = sender
this.Columns(0).HeaderText = String.Format("{0}<br>({1})", HeaderTextLanguage, HeaderTextLanguageIso)
End Sub
Private Sub gvSnippets_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gvSnippets.RowDataBound
Dim this As GridView = sender
Dim drv As DataRowView = e.Row.DataItem
If e.Row.RowType = DataControlRowType.DataRow Then
If NeedHeaderText Then
HeaderTextLanguage = drv("language")
HeaderTextLanguageIso = drv("iso")
NeedHeaderText = False
End If
e.Row.Cells(0).Text = Server.HtmlEncode(drv("Somefieldnameofyours"))
End If
End Sub
End Class
我不知道您是如何填充 <asp:GridView ID="gvSnippets" runat="server"
AutoGenerateColumns="False">
</asp:GridView>
的,但我使用SqlDataSource来填充Code Behind中的表格。请注意,上面没有GridView ds
:
DataSourceID
然后在Code Behind中,我可以这样做:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="select top 10 user_id, user_name, user_logon, 'English' as language, 'en' as iso from tbl_users"
ConnectionString='<%$ ConnectionStrings:MyConnectionString %>'>
</asp:SqlDataSource>
现在Gridview动态填充,您仍然可以根据需要处理DataBinding事件期间的所有格式。
答案 2 :(得分:0)
这是我提出的解决方案,适用于我的特定情况。
我正在构建数据以在代码中填充GridView。我创建一个DataTable,向其添加列,然后填充这些列。像:
dim dslang=GetListOfLanguages()
dim dtgv=new DataTable()
for each row as DataRow in dslang.tables(0).rows
dim language_name=row("name")
dim language_code=row("code")
dtgv.columns.add(String.format("{0}<br/>({1})",language_name, language_code)
end for
... bunch of other stuff ...
... inside a loop that reads the data ...
dim outrow=dtgv.NewRow()
... get data for a specific language ...
outrow(language_code)=text
... later ...
my_gridview.datasource=dtgv
my_gridview.databind()
所以我的解决方案:
创建GridView时,设置HtmlEncode = false。这样可以正确显示标题。
填充数据时,请说
outrow(language_code)=HttpUtility.HtmlEncode(text)
所以我将数据添加到数据表中,最终将用作已经编码的gridview的数据源,因此我不需要依赖Gridview对其进行编码。
我认为这是一个平庸的解决方案,因为它只能起作用,因为我从使用代码构建的DataTable填充GridView。如果我直接从标记中指定的DataSource填充GridView,或者从数据库查询创建的DataSet填充GridView,那么放置HttpUtility.HtmlEncode调用就没有方便的地方。