2011-03-23 19 views
2

我创建了一个自定义服务器控件,派生自System.Web.Contols.CheckBoxList以定制CheckBoxList的呈现方式。我还想添加另一个可绑定字段,并获取CheckBoxList.RenderItem()方法中字段的值。我想要创建的字段应该包含一个值,指定是否检查CheckBoxListItem。我已经阅读了一些关于自定义DataFields的文章,但它从来没有得到详细解释。带有附加绑定字段的ASP.NET服务器控件

我已经包括了我的课的一部分,以更好地解释我似乎无法理解的内容。

public class ListedCheckBoxList : CheckBoxList 
{ 
    protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer) 
    { 
     if (itemType != ListItemType.Item) 
      return; 

     var item = base.Items[repeatIndex]; 

     string cbxHtml = string.Format("<input type=\"checkbox\" value=\"{0}\" name=\"{1}\" /> {2}", 
      item.Value, 
      string.Concat(this.ClientID, repeatIndex), 
      item.IsChecked, // <-- My custom bindable field 
      item.Text); 

     writer.Write(cbxHtml); 
    } 
} 

当使用在.aspx页面这种控制,我试图绑定像这样

<abc:ListedCheckBoxList ID="cbxList" runat="server" 
    DataValueField="UserId" 
    DataTextField="UserFullName" 
    DataIsCheckedField="UserIsActive" /> 
+0

您的问题回答了我的问题,谢谢! – guanome 2013-01-07 19:27:47

+0

复选框的选中状态是否已张贴?我必须设置唯一的ID才能使其工作。 – guanome 2013-01-08 16:17:13

回答

2

这是我一年前写的一个版本。我希望能够绑定检查的状态以及单个项目的工具提示。希望它有帮助...

public class CheckBoxList_Extended : CheckBoxList 
{ 
    /// <summary> 
    /// Gets or sets the name of the data property to bind to the tooltip attribute of the individual CheckBox. 
    /// </summary> 
    [DefaultValue("")] 
    public string DataTooltipField 
    { 
     get 
     { 
      string value = base.ViewState["DataTooltipField"] as string; 
      if (value == null) 
       value = ""; 
      return value; 
     } 
     set 
     { 
      if (value == null || value.Trim() == "") 
      { 
       base.ViewState.Remove("DataTooltipField"); 
      } 
      else 
      { 
       base.ViewState["DataTooltipField"] = value.Trim(); 
      } 
     } 
    } 
    /// <summary> 
    /// Gets or sets the name of the data property to bind to the Checked property of the individual CheckBox. 
    /// </summary> 
    [DefaultValue("")] 
    public string DataCheckedField 
    { 
     get 
     { 
      string value = base.ViewState["DataCheckedField"] as string; 
      if (value == null) 
       value = ""; 
      return value; 
     } 
     set 
     { 
      if (value == null || value.Trim() == "") 
      { 
       base.ViewState.Remove("DataCheckedField"); 
      } 
      else 
      { 
       base.ViewState["DataCheckedField"] = value.Trim(); 
      } 
     } 
    } 

    protected override void PerformDataBinding(System.Collections.IEnumerable dataSource) 
    { 
     if (dataSource != null) 
     { 
      string dataSelectedField = this.DataCheckedField; 
      string dataTextField = this.DataTextField; 
      string dataTooltipField = this.DataTooltipField; 
      string dataValueField = this.DataValueField; 
      string dataTextFormatString = this.DataTextFormatString; 

      bool dataBindingFieldsSupplied = (dataTextField.Length != 0) || (dataValueField.Length != 0); 
      bool hasTextFormatString = dataTextFormatString.Length != 0; 
      bool hasTooltipField = dataTooltipField.Length != 0; 
      bool hasSelectedField = dataSelectedField.Length != 0; 

      if (!this.AppendDataBoundItems) 
       this.Items.Clear(); 

      if (dataSource is ICollection) 
       this.Items.Capacity = (dataSource as ICollection).Count + this.Items.Count; 

      foreach (object dataItem in dataSource) 
      { 
       ListItem item = new ListItem(); 

       if (dataBindingFieldsSupplied) 
       { 
        if (dataTextField.Length > 0) 
        { 
         item.Text = DataBinder.GetPropertyValue(dataItem, dataTextField, null); 
        } 
        if (dataValueField.Length > 0) 
        { 
         item.Value = DataBinder.GetPropertyValue(dataItem, dataValueField, null); 
        } 
       } 
       else 
       { 
        if (hasTextFormatString) 
        { 
         item.Text = string.Format(CultureInfo.CurrentCulture, dataTextFormatString, new object[] { dataItem }); 
        } 
        else 
        { 
         item.Text = dataItem.ToString(); 
        } 
        item.Value = dataItem.ToString(); 
       } 
       if (hasSelectedField) 
       { 
        item.Selected = (bool)DataBinder.GetPropertyValue(dataItem, dataSelectedField); 
       } 
       if (hasTooltipField) 
       { 
        string tooltip = DataBinder.GetPropertyValue(dataItem, dataTooltipField, null); 
        if (tooltip != null && tooltip.Trim() != "") 
        { 
         item.Attributes["title"] = tooltip; 
        } 
       } 
       this.Items.Add(item); 
      } 
     } 
     base.PerformDataBinding(null); 
    } 
} 
+0

太棒了!我不明白所有这些文章如何能够让这样的混乱。这正是我所追求的。 – sshow 2011-03-23 18:35:20

+0

我不能把所有的功劳,我找到了一些很好的文章,把我放到这种技术。不幸的是,我没有记笔记,所以我不能指出其他人回到他们身边。 = P – Rozwel 2011-03-23 18:46:12

0

复选框已经有“经过”

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox.checked.aspx

的一个属性,

您可以相当容易地添加一个自定义,但只需添加一个新的公共属性即可。然后,您可以通过编程或aspx代码进行设置。

public class ListedCheckBoxList : CheckBoxList 
{ 
    public string CustomTag { get; set; } 
    //...snip 
} 

<myControls:myCheckBox runat='server' Checked='True' CustomTag="123test" /> 
+0

该字段不是DataBindable。我编辑了我的问题以更好地描述所需的功能。 – sshow 2011-03-23 18:29:54

+0

啊,我现在看到我误解了。很高兴别人能够帮助。 – asawyer 2011-03-23 18:38:10

相关问题