【问题标题】:How can I change the field type on a GridView at runtime with AutoGenerate="True"?如何在运行时使用 AutoGenerate="True" 更改 GridView 上的字段类型?
【发布时间】:2009-09-14 22:10:26
【问题描述】:

我创建了一个扩展 BoundField 控件的控件,以便对传入其中的数据进行一些特殊处理。

我现在有一个具有 AutoGenerateColumns="true" 的网格,我想通过它截取 HeaderText,看看它是否是一个特定的值,然后换成“SpecialBoundField”。我尝试使用 OnDataBinding 事件循环遍历列,但此时网格中没有列。我认为 RowDataBound 和 DataBound 在游戏中为时已晚,所以不知道该怎么办。

我的下一个想法是覆盖网格控件本身以添加“AutoGeneratingColumn”事件

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)

谁能帮助或指出一个更好的方向?谢谢!

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    如果您将两个字段都返回到数据集中,我建议您设置列可见性,而不是尝试动态添加或更改数据字段。不可见的列不会呈现任何 HTML,因此只需在绑定时查看标题行,检查您感兴趣的字段并设置列的可见性。

    void myGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
      {
    
        if (e.Row.RowType == DataControlRowType.Header)
        {
          if (e.Row.Cells[1].Text = "BadText")
          {
             myGridView.Columns[1].Visible = false;
             myGridView.Columns[5].Visible = true;
          }
        }
      }
    

    【讨论】:

    • 这可能有效,但我确实需要将实际列类型从简单的“BoundField”更改为“SpecialBoundField”。我会试一试并报告。
    【解决方案2】:

    我最终得到了什么:

    public class SpecialGridView : GridView
    {
        protected override void OnRowDataBound(GridViewRowEventArgs e)
        {
            ModifyData(e);
            base.OnRowDataBound(e);
        }
    
        IList<string> _columnNames = new List<string>();
        protected void ModifyData(GridViewRowEventArgs e)
        {
            LoadColumnNames(e);
    
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    string currentColumnName = _columnNames[i];
                    if (IsSpecialColumn(currentColumnName))
                    {
                        string text = e.Row.Cells[0].Text;
                        bool isSpecialData = text.ToUpper() == "Y";
    
                        if (isSpecialData)
                        {
                            e.Row.Cells[i].CssClass += " specialData";
                        }
                    }
                }
            }
        }
    
        private void LoadColumnNames(GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                foreach (TableCell cell in e.Row.Cells)
                {
                    _columnNames.Add(cell.Text);
                }
            }
        }
    
        private bool IsSpecialColumn(string currentColumnName)
        {
            foreach (string columnName in SpecialColumnNames)
            {
                if (currentColumnName.ToUpper() == columnName.ToUpper())
                {
                    return true;
                }
            }
            return false;
        }
    
        private IList<string> _specialColumnNames = new List<string>();
        public IList<string> SpecialColumnNames
        {
            get { return _specialColumnNames; }
            set { _specialColumnNames = value; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多