2009-09-14 19 views
2

我已經創建了一個控件,它擴展了BoundField控件,以對傳遞給它的數據執行一些特殊處理。如何在運行時使用AutoGenerate =「True」更改GridView上的字段類型?

我現在有一個AutoGenerateColumns =「true」的網格,通過它我想攔截HeaderText,看看它是否是一個特定的值,然後在「SpecialBoundField」中交換。我試過使用OnDataBinding事件循環遍歷列,但此時網格中沒有列。我認爲RowDataBound和DataBound在遊戲中太遲了,所以不知道該怎麼做。

我的下一個念頭,就是覆蓋網格控件本身在「AutoGeneratingColumn」事件添加在

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties) 

誰能幫助或點我一個更好的方向發展?謝謝!

回答

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

這可以工作,但我確實需要從簡單的「綁定列」,以「SpecialBoundField」改變實際列類型爲好。我會放棄並報告。 – rball 2009-09-14 22:38:37

+0

讓我到我需要去的地方,我的解決方案也發佈了... – rball 2009-09-21 18:07:20

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; } 
    } 
} 
相關問題