كيفية تقديم HTML فك الشفرة في (أي
) في الخلية GridView
سؤال
وأنا ملزم GridView لاستعلام LINQ. بعض الحقول في الكائنات التي تم إنشاؤها من قبل بيان LINQ هي سلاسل، وتحتاج لاحتواء خطوط جديدة.
وعلى ما يبدو، GridView HTML-بترميز كل شيء في كل خلية، لذلك لا يمكن إدراج
لإنشاء خط جديد داخل خلية.
وكيف أقول GridView عدم HTML تشفير محتويات الخلايا؟
وربما ينبغي علي استخدام التحكم المختلفة بدلا من ذلك؟
المحلول
يمكنك الاشتراك في الحدث RowDataBound؟ إذا كنت تستطيع، يمكنك تشغيل:
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[0].Text);
e.Row.Cells[0].Text = decodedText;
}
نصائح أخرى
وماذا عن تعيين الخاصية HtmlEncode
للfalse
؟ بالنسبة لي، وهذا هو أبسط من ذلك بكثير.
<asp:BoundField DataField="MyColumn" HtmlEncode="False" />
هل أسطر جديدة العادية الحفاظ عليها في الإخراج؟ إذا كان الأمر كذلك، يمكنك إرسال أسطر جديدة، واستخدام أسلوب white-space: pre
المغلق، الذي من شأنه الحفاظ على أسطر جديدة، ومساحات وعلامات التبويب.
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 0; i < e.Row.Cells.Count; i++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[i].Text);
e.Row.Cells[i].Text = decodedText;
}
}
}
وأعمال الجواب هو بويسون ولكن فقط لعمود واحد. إذا قمت بتشغيل حلقة في حال RowDataBound، يمكنك استبدال متغير ل[0] ويكون هذا العمل على كل عمود إذا كنت تريد. وهنا ما فعلته:
protected void gridCart_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 1; i < 4; i++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decode = HttpUtility.HtmlDecode(e.Row.Cells[i].Text);
e.Row.Cells[i].Text = decode;
}
}
}
ويتم تشغيل منجم عمدا في 1 بسبب البيانات الخاصة بي، ولكن من الواضح انها ستعمل مع كل ما تحتاجه.
وحصلت حول هذا عن طريق أولا إدخال البيانات إلى مائدتي مزود خادم من مربع نص متعدد الخطوط باستخدام
replace (txt = Replace(txt, vbCrLf,"<br />"))
وبعد ذلك اعتدت حل راي بويسون للعودة لبلدي gridview:
Protected Sub grdHist_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdHist.RowDataBound
Dim col1 As String = HttpUtility.HtmlDecode(e.Row.Cells(2).Text)
e.Row.Cells(2).Text = col1
End Sub
protected void gvHead_OnRowDataBound(object sender, GridViewRowEventArgs e) {
for (int i = 0; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].Text = HttpUtility.HtmlDecode(e.Row.Cells[i].Text);
}
لديك لربط الحدث DataBoundGrid وتغيير التقديم لالأعمدة التي ترغب في تقديم كود HTML.
public event EventHandler DataBoundGrid {
add { ctlOverviewGridView.DataBound += value; }
remove { ctlOverviewGridView.DataBound -= value; }
}
ctlOverview.DataBoundGrid += (sender, args) => {
((sender as ASPxGridView).Columns["YourColumnName"] as GridViewDataTextColumn).PropertiesTextEdit.EncodeHtml = false;
};
وإجابات @Ray Booysen
هو حق ولكن في بعض الحالات HtmlDecode () لا يمكن التعامل مع مشكلتك. يمكنك استخدام UrlDecode () بدلا من HtmlDecode ().
هنا حل آخر:
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text);
e.Row.Cells[0].Text = decodedText;
}