我正在用这样的方法创建一个GridView:
GridView gridView = new GridView();
gridView.DataSource = reportData.Tables[0];
gridView.DataBind();
我稍后将其导出到Excel,效果很好。这些列是从我的源数据自动生成的。我想在我数据绑定之后和导出到Excel之前更改某些列的DataFormatString属性。我似乎无法找到正确的属性来改变。任何人都可以指出我正确的方向吗?
答案 0 :(得分:7)
根据AutoGenerateColumns documentation:
此选项提供了一种方便的方法 显示数据中的每个字段 资源;但是,你有限制 如何自动控制 生成的列字段显示或 行为。
注意:自动 生成的绑定列字段不是 添加到Columns集合。
我厌倦了寻找这些AutoGeneratedField
而没有运气
我可以想到实现这一目标的几种方案(从最差到最好):
RowDataBound
),这将使您可以访问行的单元格,但不太方便。不要使用AutoGeneratedField
手动创建这些列,如:
BoundField dateField = new BoundField();
dateField.HeaderText = "Date";
dateField.DataField = "date";
dateField.DataFormatString = "{0:MMMM, yyyy}";
gridView.Columns.Add(dateField);
此选项可让您控制标题。
List<Employee)
),并且AutoGeneratedField
将它们转换为列。登记/>
我认为这是最好的选择。假设您可以访问自动列,那么呢?您必须根据其名称或索引搜索列,这似乎非常混乱,并且会增加耦合。而且,作为最后一点,您应该考虑使用API创建Excel文件。它并不容易,但HTML XLS文件与Excel 2007的兼容性较低 - 它会显示一条警告消息,指出文件的格式与扩展名不兼容,更糟糕的是,如果文件被打开并保存,则文件会被制动(可以是{{ 1}}虽然),使你的文件不那么用户友好。
答案 1 :(得分:0)
例如:
String newDataFormatString = "{0:d}";
BoundField bf = gridView.Columns[Index] as BoundField;
if (bf != null) {
bf.DataFormatString = "{0}"; // workaround to sync with ViewState (it's documented)
bf.DataFormatString = newDataFormatString;
}
答案 2 :(得分:-1)
这是asp.net的工作原理。当您在方法中创建一些控件(列)并将此控件设置为user时,下次用户将数据回发给您时,您无法访问这些列,因为它们不存在。每次显示您的网站时,都会创建一个全新的对象(实例) 能够从以前创建的控件中回发数据的唯一方法是在Page_Init方法中创建控件...
答案 3 :(得分:-1)
这是我编写的GridView导出器的摘录,它将GridView中的控件转换为重新格式化的文字。它可能会有所帮助:
/// <summary>
/// Parses and cleans up data from the GridView controls collection
/// to make the data more suitable for Exported
/// </summary>
/// <param name="gv">The GridView to parse</param>
private void CleanUpControls(Control gv)
{
Literal l = new Literal();
for (int i = 0; i < gv.Controls.Count; i++)
{
if (gv.Controls[i].GetType() == typeof (LinkButton))
{
l.Text = (gv.Controls[i] as LinkButton).Text;
ReplaceWithLiteral(gv, l, i);
}
else if (gv.Controls[i].GetType() == typeof (ListControl))
{
l.Text = (gv.Controls[i] as ListControl).SelectedItem.Text;
ReplaceWithLiteral(gv, l, i);
}
else if (gv.Controls[i].GetType() == typeof (CheckBox))
{
l.Text = (gv.Controls[i] as CheckBox).Checked ? "True" : "False";
ReplaceWithLiteral(gv, l, i);
}
else if (gv.Controls[i].GetType() == typeof (BooleanImage))
{
l.Text = (gv.Controls[i] as BooleanImage).Value ? "True" : "False";
ReplaceWithLiteral(gv, l, i);
}
else if (gv.Controls[i].GetType().ToString() == "System.Web.UI.WebControls.PagerTable")
ReplaceWithLiteral(gv, l, i);
else if (gv.Controls[i].GetType() == typeof (HyperLink))
{
HyperLink hl = gv.Controls[i] as HyperLink;
if (MakeHyperLinksAbsolute)
{
if (hl != null)
hl.NavigateUrl = UrlHelper.MakeAbsoluteUrl(hl.NavigateUrl);
}
switch (TreatHyperLinksAs)
{
case HyperLinkMode.Text:
l.Text = hl.Text;
ReplaceWithLiteral(gv, l, i);
break;
case HyperLinkMode.NavigateUrl:
if (hl != null) l.Text = hl.NavigateUrl;
ReplaceWithLiteral(gv, l, i);
break;
case HyperLinkMode.ToolTip:
l.Text = hl.ToolTip;
ReplaceWithLiteral(gv, l, i);
break;
case HyperLinkMode.TextAndLink:
l.Text = String.Format("{0} ({1})", hl.Text, hl.NavigateUrl);
ReplaceWithLiteral(gv, l, i);
break;
case HyperLinkMode.HyperLink:
break;
}
}
if (gv.Controls[i].HasControls())
CleanUpControls(gv.Controls[i]);
}
}