代码之家  ›  专栏  ›  技术社区  ›  Mike Cole

从代码隐藏更改GridView列属性

  •  5
  • Mike Cole  · 技术社区  · 15 年前

    我正在用这样的方法创建一个网格视图:

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

    我稍后将其导出到Excel,它工作得很好。正在从源数据自动生成列。我想在数据绑定之后和导出到Excel之前更改一些列的dataFormatString属性。我似乎找不到正确的财产来改变。有人能给我指个方向吗?

    4 回复  |  直到 15 年前
        1
  •  7
  •   Kobi    15 年前

    根据 AutoGenerateColumns documentation :

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

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

    我找这些累了 AutoGeneratedField 没有运气。
    我可以想出几种方法来实现这一点(从最坏到最好):

    1. 向网格中添加事件(如 RowDataBound ,这将允许您访问行的单元格,但不太方便。
    2. 不要使用 自动生成字段 手动创建这些列,如中所示:

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

      此选项使您能够控制标题。

    3. 为数据格式和表示添加另一层。这可能是最好的选择。而且,这样就不必使用数据表,网格视图可以绑定到具有公共属性的任何对象集合(例如 List<Employee) ) 自动生成字段 将它们转换为列。
      我认为这是最好的选择。假设您可以访问自动列,那么呢?您必须根据一个列的名称或索引来搜索它,这看起来非常混乱,并且增加了耦合度。

    最后一点,您应该考虑使用API创建Excel文件。这并不容易,但HTML XLS文件与Excel 2007的兼容性较差-它会显示一条警告消息,说明文件的格式与扩展名不兼容,更糟的是,如果文件被打开并保存,它会刹车(可以 Save As 但是,会降低文件的用户友好性。

        2
  •  0
  •   João Silva    15 年前

    例如:

    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;
    }
    
        3
  •  -1
  •   smok1    15 年前

    这是ASP.NET如何工作的问题。当您在方法中创建一些控件(列)并将此控件设置为“用户”时,下次用户向您发布数据时,您将无法访问这些列,因为它们不存在。每次显示站点时,都会创建一个全新的对象(实例)。
    从以前创建的控件中获取回发数据的唯一方法是在page_init method_中创建控件。

        4
  •  -1
  •   Dan Diplo    15 年前

    以下是我编写的一个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]);
            }
        }