2009-09-29 3 views
0

Je veux changer la valeur du texte dans un ButtonField en fonction d'autres facteurs. Certains code:Comment changer la valeur d'un ButtonField étendu?

public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) 
    { 
     base.InitializeCell(cell, cellType, rowState, rowIndex); 

     bool isDataRowAndIsHighlightFieldSpecified = cellType == DataControlCellType.DataCell && !string.IsNullOrEmpty(UnnpiFlagField); 
     if (isDataRowAndIsHighlightFieldSpecified) 
     { 
      cell.DataBinding += new EventHandler(cell_DataBinding); 
     } 
    } 

    private void cell_DataBinding(object sender, EventArgs e) 
    { 
     TableCell cell = (TableCell)sender; 
     object dataItem = DataBinder.GetDataItem(cell.NamingContainer); 

     IButtonControl button = cell.Controls[0] as IButtonControl; 
     button.Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(); 
     bool highlightTheText = DataBinder.GetPropertyValue(dataItem, IsFlagField).ToString().ToUpper() == "Y"; 
     if (highlightTheText) 
     { 
      cell.CssClass = string.Concat(ItemStyle.CssClass, " thisChangesFine"); 
      button.Text = "CHANGE ME"; 
     } 
    } 

Ce code fonctionne très bien pour BoundField, dans lequel le texte de la cellule est modifiée et a mis en évidence, mais même si le bouton de contrôle a en effet un bouton avec le CommandName est-elle correcte via la page ASPX, la valeur du texte initialement ne contient rien et semble être placé ailleurs. Quand je l'ai mis ici à une autre valeur, il semble que la valeur initiale soit remise à un autre endroit. En regardant dans Reflector, je ne vois pas où cela pourrait se produire. Réflecteur:

protected override DataControlField CreateField() 
public override bool Initialize(bool sortingEnabled, Control control) 
private void OnDataBindField(object sender, EventArgs e) [Can't get that one :(] 
protected override void CopyProperties(DataControlField newField) 
protected virtual string FormatDataTextValue(object dataTextValue) 
public override void ValidateSupportsCallback() 

J'ai vérifié chacun d'eux et je ne vois pas la valeur définie. Cela ne semble se produire dans le OnDataBindField (objet, EventArgs) ici:

if ((this.textFieldDesc == null) && (component != null)) 
    { 
     ... 
     this.textFieldDesc = TypeDescriptor.GetProperties(component).Find(dataTextField, true); 
     ... 
    } 
    if ((this.textFieldDesc != null) && (component != null)) 
    { 
     object dataTextValue = this.textFieldDesc.GetValue(component); 
     str = this.FormatDataTextValue(dataTextValue); 
    } 
    ... 
    ((IButtonControl) control).Text = str; 

Ce que je pense se passerait-il avant que je suis en train de changer la valeur, mais comme je l'ai déjà dit, il semble que button.Text est string.Empty dans la méthode cell_DataBinding.

Vous avez des idées?

Répondre

0

Je passe par en cas databound et créer une liste de chaînes pour émettre lorsque le PreRender est appelé:

  public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) 
    { 
     base.InitializeCell(cell, cellType, rowState, rowIndex); 

     bool isDataRowAndIsHighlightFieldSpecified = cellType == DataControlCellType.DataCell && !string.IsNullOrEmpty(SpecialField); 
     if (isDataRowAndIsHighlightFieldSpecified) 
     { 
      cell.DataBinding += new EventHandler(cell_DataBinding); 
      cell.PreRender += new EventHandler(cell_PreRender); 
     } 
    } 

et

IList<string> buttonsText = new List<string>(); 
    private void cell_DataBinding(object sender, EventArgs e) 
    { 
     TableCell cell = (TableCell)sender; 
     object dataItem = DataBinder.GetDataItem(cell.NamingContainer); 
     bool specialData = DataBinder.GetPropertyValue(dataItem, SpecialField); 
     if (specialData) 
     { 
      cell.CssClass = string.Concat(ItemStyle.CssClass, " special"); 
      buttonsText.Add("Replace text"); 
     } 
     else 
     { 
      buttonsText.Add(DataBinder.GetPropertyValue(dataItem, DataTextField).ToString()); 
     } 
    } 

et enfin dans la pré rendre:

void cell_PreRender(object sender, EventArgs e) 
    { 
     TableCell cell = (TableCell)sender; 
     IButtonControl button = cell.Controls[0] as IButtonControl; 
     int index = ((GridViewRow)cell.NamingContainer).RowIndex; 
     button.Text = buttonsText[index]; 
    } 

Le seul inconvénient de cette approche est que vous devez appeler databind. Je suis bien, donc ce n'était pas un problème pour moi et travaillé Peachy.