2009-09-04 34 views
5

Tôi muốn tạo một điều khiển mở rộng BoundField được sử dụng trong GridView. Những gì tôi muốn làm là cung cấp một thuộc tính khác có tên là HighlightField sẽ tương tự như thuộc tính DataField trong đó tôi muốn đặt cho nó tên cột dữ liệu. Cho rằng cột dữ liệu nó sẽ thấy nếu giá trị là đúng hay sai và làm nổi bật văn bản đã cho trong cột đã cho trên hàng đã cho.Mở rộng một (ASP.NET) BoundField

Một số psuedo-mã nếu điều đó không có ý nghĩa:

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

Và rồi trong DataBind hoặc một cái gì đó:

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

cướp chỉ cho tôi trong đúng hướng, đây là những gì tôi đã kết thúc lên với:

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

Trả lời

5

Untested:

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

Tôi thích nó, tôi sẽ cho nó một vòng xoáy và quay lại – rball

+0

Không có cách nào để thực hiện dữ liệu hai chiều? Bạn có thể tạo một thuộc tính boolean trên HighlightBoundField của bạn được gọi là "IsHighlighted" và làm một cái gì đó như thế này: Chris

Các vấn đề liên quan