2016-04-26 14 views
0

私はGridViewを持っています。実際の詳細データであるセルのコンテンツをhtmlでエンコードすることを希望します。しかし、私は見出しに生のHTMLを残したいと思います。本文をhtmlencodeする方法はありますが、グリッドビューの見出しはありません

つまり、この場合の見出しは言語名とISOコードです(例:英語(EN))。私は名前とコードを別々の行に入れたいので、見出しを "< 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がエンコードされていない場合、私は改行を受け取り、 "< br/>"ではありません。次に、データにエンティティが存在し、エンティティが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> 

は何<列>マークアップはありません。私は完全にコードで列を構築します。マークアップで列を指定するより一般的なケースと同じ動作が発生するかどうかはテストしていません。

+0

'GridView'の' 'マークアップを提供できますか? – fnostro

答えて

0

私は以下の提案を持っているあなたのポストで提供される情報の私の読書に基づいてループの最初

row("language") = HttpUtility.HtmlEncode(dr("language")) 
row("name") = HttpUtility.HtmlEncode(dr("name")) 
+0

うーん、それがどう助けてくれるだろうか。 「言語」と「名前」には、「英語」「EN」「スペイン語」「ES」などのプレーンテキストが含まれています。 HtmlEncodeはそれらを変更しません。しかし、この投稿は私にアイデアを与えます。HtmlEncode = falseを設定してから、詳細データでHttpUtility.HtmlEncodeを実行します。 – Jay

0

にコード行を追加します。

あなたは生の書式設定データを分離する必要がありますデータ。

DataTableは、GridViewのデータソースです。 DataTableには、完全にフォーマットされていない純粋なデータのみが含まれている必要があります。

DataTableは、GridView DataSourceを設定し、DataBind()を呼び出して、Gridviewにバインドされます。 gvSnippets.Databind()を呼び出すと、あなたができるようになりますGridviewsに関連するすべてのデータバインディングイベントをトリガします:

  1. は、簡単な書式設定を管理し、ASPXマークアップでGridViewの列に結合します。
  2. RowDataBoundイベントのような特定のGridViewイベントのコードビハインドで、より複雑な書式設定を処理します。 GridViewのヘッダーについて

HeaderTextは、GridViewのの最上部に一度表示されていないすべてのバインドされたフィールドは、HeaderTextプロパティを持っているにもかかわらず、行ごとに、GridView.HeaderRowで内部に格納されています。あなたの更新ごと


例の抜粋gvSnippetsマークアップ:

<asp:GridView ID="gvSnippets" runat="server" 
    AutoGenerateColumns="False" SkinID="skin3" 
    EmptyDataText="No records found" Visible="false"> 
    </asp:GridView> 

その後、あなたは、コードの後ろに、このようなことを行うことができます。動的に対処

Public 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 

補遺細胞

0123私はあなたがあなたの dsを移入しているのか分からないが、私は背後にあるコードでテーブルを埋めるためにSqlDataSourceコントロールを使用してい

<asp:GridView ID="gvSnippets" runat="server" 
    AutoGenerateColumns="False"> 
    </asp:GridView> 

:GridViewのように定義するために

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    GetDataSetAndPopulate(gvSnippets) 

    End Sub 

    Private Sub GetDataSetAndPopulate(gv As GridView) 
    Dim view As DataView = SqlDataSource1.Select(DataSourceSelectArguments.Empty) 
    Dim table As DataTable = view.ToTable() 
    Dim ds As DataSet = New DataSet() 
    ds.Tables.Add(table) 

    For Each dc As DataColumn In ds.Tables(0).Columns 
     Dim field As New BoundField 
     field.DataField = dc.ColumnName 
     field.HeaderText = dc.ColumnName 
     gv.Columns.Add(field) 
    Next 

    gv.DataSource = ds 
    gv.DataBind() 

    End Sub 

そして今、GridViewのが動的に読み込まれると、あなたはまだデータバインディング時にすべての書式を処理することができます:私はこれを行うことができますコードの後ろに続いて

<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のDataSourceIDが上に存在しないことに注意してくださいイベントは必要に応じて

+0

あなたのGridviewの定義を反映するように変更されました – fnostro

+0

他のもの...フィールド名が同じままになることがわかっているなら、aspxのマークアップを使う方が簡単です。あなたがやっているのは、将来のデータを期待して列を定義することだけです。 Bindingプロセスは、実際にそれをすべて一緒に結び付けます。 – fnostro

+0

FYI:この質問に関連するものまでスキニーを試してみましたが、データに応じて異なるため、コードに列を作成します。ユーザーがプロジェクトを選択する画面の上部にドロップダウンがあります。プロジェクトごとに1つ以上の言語のデータがありますが、言語の組み合わせはプロジェクトごとに異なります。プロジェクトAには英語とスペイン語の列があります。プロジェクトBには中国語、韓国語、日本語などがあります。各言語には多くのテキストブロックがあります。したがって、各ブロックに行があり、それぞれに列があります言語。 – Jay

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、またはデータベースクエリによって作成されたDataSetからGridViewを直接読み込んでいた場合、HttpUtility.HtmlEncode呼び出しを入れる便利な場所はありません。

関連する問題