从代码隐藏更改GridView列属性

时间:2009-07-16 20:55:00

标签: asp.net gridview

我正在用这样的方法创建一个GridView:

GridView gridView = new GridView();
gridView.DataSource = reportData.Tables[0];
gridView.DataBind();

我稍后将其导出到Excel,效果很好。这些列是从我的源数据自动生成的。我想在我数据绑定之后和导出到Excel之前更改某些列的DataFormatString属性。我似乎无法找到正确的属性来改变。任何人都可以指出我正确的方向吗?

4 个答案:

答案 0 :(得分:7)

根据AutoGenerateColumns documentation

  

此选项提供了一种方便的方法   显示数据中的每个字段   资源;但是,你有限制   如何自动控制   生成的列字段显示或   行为

     

注意:自动   生成的绑定列字段不是   添加到Columns集合

我厌倦了寻找这些AutoGeneratedField而没有运气 我可以想到实现这一目标的几种方案(从最差到最好):

  1. 向网格添加一个事件(如RowDataBound),这将使您可以访问行的单元格,但不太方便。
  2. 不要使用AutoGeneratedField手动创建这些列,如:

    BoundField dateField = new BoundField();
    dateField.HeaderText = "Date";
    dateField.DataField = "date";
    dateField.DataFormatString = "{0:MMMM, yyyy}";
    gridView.Columns.Add(dateField); 
    

    此选项可让您控制标题。

  3. 添加另一个图层以进行数据格式化和演示。这可能是最好的选择。此外,通过这种方式,您不必使用DataTables,GridView可以绑定到具有公共属性的任何对象集合(例如,到List<Employee)),并且AutoGeneratedField将它们转换为列。登记/> 我认为这是最好的选择。假设您可以访问自动列,那么呢?您必须根据其名称或索引搜索列,这似乎非常混乱,并且会增加耦合。
  4. 而且,作为最后一点,您应该考虑使用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]);
        }
    }