我有一个GridView,其数据源是作为DataTable动态构建的 - 如果我在代码中指定结构,我如何指定特定于列的包装?
我没有找到任何处理这种特定情况的内容,因为我只需要在特定的位置中包含一些列,例如在'Long'之后将第二列包裹在下面,但留下其他人。添加\n
或<br />
不起作用,因为它们只被视为文字。
var statsTable = new DataTable();
statsTable.Columns.Add("Run Date", typeof(DateTime));
statsTable.Columns.Add("Needlessly Long Test Header", typeof(string));
...etc
statsTable.Rows.Add(runDate, "example", ...)
gridView.DataSource = statsTable;
gridView.DataBind();
不确定这是否相关,但我发现我需要在我的GridView上保留AutoGenerateColumns = true
,否则不会显示任何内容。这让我感到困惑,因为我认为指定列可以解决问题 - 如果这与此问题无关,我稍后会问另一个。
使用.Net 3.5,如果这会影响答案。这似乎是一个简单/常见的问题。
答案 0 :(得分:0)
您可以使用自定义类来实现:
class CustomDataRow
{
public string ColumnHeader { get; set; }
public string ColumnName { get; set; }
public string ColumnValue { get; set; }
}
然后,您可以使用List来绑定网格,而不是DataTable。然后,在ItemDataBound事件中,您可以将DataItem强制转换为CustomDataRow。如果e.Item.ItemType是标题,请设置标题文本。如果是项目,请设置文本值。
答案 1 :(得分:0)
给这样的东西一个镜头:
标记:
<asp:TemplateField>
<HeaderTemplate>
<%#HttpUtility.HtmlDecode(InsertBreaks(Eval("DataField")))%>
</HeaderTemplate>
</asp:TemplateField>
使用LiteralControl:
<asp:TemplateField>
<HeaderTemplate>
<asp:Literal ID="litHeader" Text='<%#HttpUtility.HtmlDecode(InsertBreaks(Eval("DataField")))%>' Mode="PassThrough"></asp:Literal>
</HeaderTemplate>
</asp:TemplateField>
代码隐藏:
protected string InsertLineBreaks(string val)
{
return val.Replace("long", "long<br/>").replace("foo", "foo<br/>");
}