我想创建一个控件,扩展在GridView中使用的BoundField。我想要做的是提供另一个名为HighlightField的属性,它与DataField属性类似,我想给它命名一个数据列。给定数据列,它将看到值是true还是false,并突出显示给定行上给定列中的给定文本。
如果没有意义,可以使用一些伪代码:
<asp:GridView id="grid">
<Columns>
<asp:BoundField DataField="Name" />
<cc:HighlightField DataField="Name" HighlightField="IsHighlighted" />
</Columns>
</asp:GridView>
然后在数据绑定中或其他内容:
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";
}
}
}
答案 0 :(得分:5)
未测试:
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");
}
}
}