asp.net - 扩展 (ASP.NET) BoundField

标签 asp.net databound-controls

我想创建一个扩展 GridView 中使用的 BoundField 的控件。我想要做的是提供另一个名为 HighlightField 的属性,该属性与 DataField 属性类似,我想将其命名为数据列。给定该数据列,它将查看该值是 true 还是 false,并突出显示给定行的给定列中的给定文本。

一些伪代码,如果这没有意义:

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

然后在数据绑定(bind)或其他内容中:

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

Ravish 为我指明了正确的方向,这就是我的最终结果:

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

最佳答案

未经测试:

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

关于asp.net - 扩展 (ASP.NET) BoundField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1379871/

相关文章:

.net - 您能推荐一个列出最常见的用户输入屏幕设计类型的资源吗?

asp.net - 无法从 View 调用通用 Url.Action<TController> 方法

asp.net - GET 与 POST 真的很重要吗?

asp.net - Azure Web应用程序找不到连接字符串

asp.net - Eval 和 ItemDataBound 或 RowDataBound 事件显示数据,哪个更好?

c# - 如何使用 C# 解码 URL 参数?

ASP.NET:使用 jQuery 绑定(bind)中继器?

sql - 为什么 - 'GENERATE INSERT UPDATE AND SELECT STATEMENT' 变灰?

ASP.NET - 显示数据透视表的理想控件