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

问题描述:

我已经创建了一个控件,它扩展了BoundField控件,以对传递给它的数据执行一些特殊处理。如何在运行时使用AutoGenerate =“True”更改GridView上的字段类型?

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

我的下一个念头,就是覆盖网格控件本身在“AutoGeneratingColumn”事件添加在

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties) 

谁能帮助或点我一个更好的方向发展?谢谢!

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

这可以工作,但我确实需要从简单的“绑定列”,以“SpecialBoundField”改变实际列类型为好。我会放弃并报告。 – rball 2009-09-14 22:38:37

+0

让我到我需要去的地方,我的解决方案也发布了... – rball 2009-09-21 18:07:20

我最终什么了:

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