2009-09-04 22 views
5

Ich möchte ein Steuerelement erstellen, das das BoundField erweitert, das in einem GridView verwandt wird. Ich möchte eine andere Eigenschaft namens HighlightField bereitstellen, die der DataField-Eigenschaft ähnlich ist, da ich ihr den Namen einer Datenspalte geben möchte. Angesichts dieser Datenspalte würde es sehen, ob der Wert wahr oder falsch ist und den gegebenen Text innerhalb der gegebenen Spalte in der gegebenen Zeile hervorheben.Erweitern eines (ASP.NET) BoundField

Einige psuedo-Code, wenn das keinen Sinn macht:

<asp:GridView id="grid"> 
    <Columns> 
    <asp:BoundField DataField="Name" /> 
    <cc:HighlightField DataField="Name" HighlightField="IsHighlighted" /> 
    </Columns> 
</asp:GridView> 

Und dann im databind oder etwas:

if(this row's IsHighlighted value is true) 
    set the CssClass of this datacell = "highlighted" 
(or wrap a span tag around the text) 

Ravish wies mich in die richtige Richtung, hier ist was ich am Ende up mit:

public class HighlightedBoundField : BoundField 
{ 
    public string HighlightField 
    { 
     get { return ViewState["HighlightField"].ToString(); } 
     set 
     { 
      ViewState["HighlightField"] = value; 
      OnFieldChanged(); 
     } 
    } 

    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(HighlightField); 
     if (isDataRowAndIsHighlightFieldSpecified) 
     { 
      cell.DataBinding += new EventHandler(cell_DataBinding); 
     } 
    } 

    void cell_DataBinding(object sender, EventArgs e) 
    { 
     TableCell cell = (TableCell)sender; 
     object dataItem = DataBinder.GetDataItem(cell.NamingContainer); 
     cell.Text = DataBinder.GetPropertyValue(dataItem, DataField).ToString(); 

     bool highlightThisCellsText = Convert.ToBoolean(DataBinder.GetPropertyValue(dataItem, HighlightField)); 
     if (highlightThisCellsText) 
     { 
      cell.CssClass += " highlight"; 
     } 
    } 
} 

Antwort

5

Ungeprüfte:

public class HighlightBoundField : DataControlField { 

    //property to indicate if this field should be highlighted, given the value of this property 
    // 
    public string HighlightField { 
     get { 
      object value = ViewState["HighlightField"]; 

      if (value != null) { 
       return Convert.ToString(value); 
      } 

      return ""; 
     } 

     set { 
      ViewState["HighlightField"] = value; 
      OnFieldChanged(); 
     } 
    } 

    //property to display as text in the cell 
    // 
    public string DataField { 
     get { 
      object value = ViewState["DataField"]; 

      if (value != null) { 
       return value.ToString(); 
      } 

      return string.Empty; 
     } 

     set { 
      ViewState["DataField"] = value; 

      OnFieldChanged(); 
     } 
    } 

    //bound field creation 
    // 
    protected override DataControlField CreateField() { 
     return new BoundField(); 
    } 

    //override the method that is used to populate and format a cell 
    // 
    public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) { 
     base.InitializeCell(cell, cellType, rowState, rowIndex); 

     //if this celltype is a data row 
     // 
     if (cellType == DataControlCellType.DataCell && !string.IsNullOrEmpty(HighlightField)) { 
      //create label control to display text 
      // 
      var lblText = new Label(); 

      //add event listener for when the label is bound 
      // 
      lblText.DataBinding += new EventHandler(lblText_DataBinding); 

      //add label to controls collection 
      // 
      cell.Controls.Add(lblText); 
     } 
    } 

    void lblText_DataBinding(object sender, EventArgs e) { 
     //retrieve data item and set label text 
     // 
     Label lblText = (Label) sender; 
     object dataItem = DataBinder.GetDataItem(lblText.NamingContainer); 
     lblText.Text = DataBinder.GetPropertyValue(dataItem, DataField).ToString(); 

     //check if value should be highlighted 
     // 
     if (Convert.ToBoolean(DataBinder.GetPropertyValue(dataItem, HighlightField))) { 
      lblText.Style.Add("background-color", "yellow"); 
     } 
    } 
} 
+0

Ich mag es, ich werde es einen Wirbel geben und zurück – rball

+0

Gibt es keine Möglichkeit, Zwei-Wege-Datenbindung zu tun? Können Sie eine boolesche Eigenschaft in Ihrem HighlightBoundField mit dem Namen "IsHighlight" erstellen und so etwas tun: Chris

Verwandte Themen