我有一个C#桌面应用程序,它连接到数据库并从数据库填充DataGridView(使用数据绑定)。 一列的值是HTML格式的值,应在DataGridView中显示为HTML。不幸的是,目前所有内容(例如标签)都是以原始格式(即不是HTML格式)编写的。
我已在互联网上找到site,此问题已经提出。不幸的是,他们没有谈论绑定数据(或者至少我不明白还有什么可以让它工作......)
有没有人可以给我一些提示? 我已经使用ILSpy来了解如何完成这项工作,但这对我来说比对它更有帮助。
答案 0 :(得分:1)
此链接可能很有用,它显示了如何创建自定义DataGridViewHTMLCell类。 https://github.com/OceanAirdrop/DataGridViewHTMLCell
答案 1 :(得分:1)
已经推出了一种简化的解决方案,用于在数据网格视图中呈现html内容。
解决方案使用WebBrowser渲染html并将内容转换为位图,然后使用图形绘制到单元格中。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DataGridViewTest
{
internal class DataGridViewHtmlCell : DataGridViewTextBoxCell
{
protected override void Paint(
Graphics graphics,
Rectangle clipBounds,
Rectangle cellBounds,
Int32 rowIndex,
DataGridViewElementStates cellState,
Object values,
Object formattedValue,
String errorText,
System.Windows.Forms.DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
// add a condition here to check formattedValue is Html
// you shall use HtmlAgilityPack to determine this.
if(isHtml)
{
RenderHtmlValue(graphics, cellBounds, formattedValue, true);
}
else
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, values, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
}
}
private Size RenderHtmlValue(
Graphics graphics,
Rectangle cellBounds,
string formattedValue,
bool drawCell)
{
using (var webBrowser = new WebBrowser())
{
webBrowser.ScrollBarsEnabled = false;
webBrowser.Navigate("about:blank");
webBrowser.Document.Write(formattedValue);
webBrowser.Size = Size;
var rect = new Rectangle(
webBrowser.Document.Body.ScrollRectangle.Location,
webBrowser.Document.Body.ScrollRectangle.Size);
rect.Width = Size.Width - cellBounds.X;
webBrowser.Size = rect.Size;
cellBounds = new Rectangle(cellBounds.X, cellBounds.Y, rect.Width, rect.Height);
var htmlBodyElement = webBrowser.Document.Body.DomElement as mshtml.IHTMLBodyElement;
htmlBodyElement.WhenNotNull(
bodyElement =>
{
cellBounds.Height += Convert.ToInt32(htmlBodyElement.bottomMargin);
});
if(drawCell)
{
using (var bitmap = new Bitmap(webBrowser.Width, webBrowser.Height))
{
webBrowser.DrawToBitmap(bitmap, targetBounds);
graphics.DrawImage(bitmap, location);
}
}
}
return cellBounds.Size;
}
protected override Size GetPreferredSize(
Graphics graphics,
System.Windows.Forms.DataGridViewCellStyle cellStyle,
Int32 rowIndex,
Size constraintSize)
{
return RenderHtmlValue(graphics, cellBounds, formattedValue, false);
}
}
}