如何在运行时使用AutoGenerate =“True”更改GridView上的字段类型?

时间:2009-09-14 22:10:27

标签: asp.net gridview

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

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

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

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)

任何人都可以帮助或指出我更好的方向吗?谢谢!

2 个答案:

答案 0 :(得分:3)

如果您在数据集中有两个字段,我建议设置列可见性,而不是尝试动态添加或更改数据字段。不可见的列不会呈现任何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;
      }
    }
  }

答案 1 :(得分:1)

我最终得到了什么:

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; }
    }
}