2011-03-23 42 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