2009-05-18 6 views
25

データの文字列値がチェックボックスのラベルになり、bool値がボックスのチェック/チェックボックスをオフにするような、ASP.NET CheckBoxListをDataBindできますか?私はちょっとチェックボックスがあることだろうと期待していたASP.NET CheckBoxListデータバインディングの質問

var usersInRole = new List<UserInRole> 
{ 
    new UserInRole { UserName = "Frank", InRole = false}, 
    new UserInRole{UserName = "Linda", InRole = true}, 
    new UserInRole{UserName = "James", InRole = true}, 
}; 

chkListRoles.DataSource = usersInRole; 
chkListRoles.DataBind(); 

:私はこのコードを持って後ろにコードで

<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" /> 

私のasp.netのWebフォーム上で

私はこのようなCheckBoxListのを持っていますInRole = trueのときにチェックされます。私もInRole = "Checked"を試みました。結果は同じでした。私はDataBindへの道を見出すことができず、自動的にチェックボックスをオン/オフにしているようです。

現在、DataBoundイベントの適切な項目に対してselected = trueを設定することで、この問題を解決しています。私の把握以上のクリーンなソリューションがあるようです。

は「InRole」この場合には...私はあなたがそれをバインドするためにどのようなプロパティコントロールを伝えなければならないだろうと思うだろうあなたに

+0

http://stackoverflow.com/questions/879434/asp-net-checkboxlist-databinding-question –

答えて

37

編集:マークアップによってこれを行う方法はありません。 DataValueFieldは、チェックボックス項目がチェックであるかどうかを判断しません。ポストバックで使用される値を取得または格納します。 DataValueFieldは、CheckBoxLists、RadioButtonLists、ListControlなどで共通です。

これは、既に見つかったチェックボックスを事前に選択するための唯一の方法です。

chkListRoles.DataSource = usersInRole; 
chkListRoles.DataBind(); 

foreach(ListItem item in chkListRoles.Items) 
item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole; 
+0

Joseさんに感謝します。 –

+3

また、私の感謝のホセ、私はそのラムダ;-)を使用するよ –

+2

ASP.NETで奇妙な省略のように見えます。なぜ彼らはDataCheckedField属性も持っていないのですか? –

0

ありがとうございます。

私はそれを使って遊んでいて、チェックボックスの選択に結びつくようになったようですが、あなたはそれを自分で行う必要があります。チェックリストのテキストと値にバインドすることができましたが、これはリスト内の各チェックボックスのラベルを扱うように見えます。

+0

* .aspxファイルで、属性DataValueField = "InRole"を持つCheckBoxListを宣言します。それはあなたが意味することですか? –

+0

これは、私が話していたことです...私はあなたがUIコードでそれを設定したのを見るためにスクロールしませんでした...ごめんなさい。 – CSharpAtl

+0

事実上、値はそれ以上の処理を行うために使用されます。 – Younes

9

私はOnItemDataBound - 結合の疲れの後に、このためのカスタムコントロールを作りました。 これはSelected属性をバインドさせます。 RadioButtonListに対して同じコントロールを簡単に作成するには、カスタムコントロールの派生元を変更します。

これを使用するには、マークアップでコントロールを作成するときに、単にDataCheckedField属性を追加します。 web.configファイルのカスタムコントロールを参照することを忘れないでください。制御用

マークアップ

<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles" 
           DataCheckedField="InRole" 
           DataTextField="UserName" 
           DataValueField="UserId" /> 

コード

public class SimpleCheckBoxList : System.Web.UI.WebControls.CheckBoxList 
{ 
    public string DataCheckedField 
    { 
     get 
     { 
      string s = (string)ViewState["DataCheckedField"]; 
      return (s == null) ? String.Empty : s; 
     } 
     set 
     { 
      ViewState["DataCheckedField"] = value; 
      if (Initialized) 
       OnDataPropertyChanged(); 
     } 
    } 

    protected override void PerformDataBinding(IEnumerable dataSource) 
    { 
     if (dataSource != null) 
     { 
      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() 
       { 
        Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(), 
        Value = DataBinder.GetPropertyValue(dataItem, DataValueField).ToString(), 
        Selected = (DataCheckedField.Length > 0) ? (bool)DataBinder.GetPropertyValue(dataItem, DataCheckedField) : false 
       }; 
       this.Items.Add(item); 
      } 
     } 
    } 
} 
+0

興味深いですが、 'dataSelectedField'はエラーを表示します。助言がありますか? – MAW74656

+0

@ MAW74656代わりに 'dataCheckedField'で置き換えてください。 3歳の誤字のように見えます。あなたの結果についてのフィードバックをお願いします! – sshow

5

これは、マークアップを使用してはできません。あなたが行うことができるのは、DataValueFieldのboolを使ってチェックボックスリストをバインドして、それをOnDataBoundイベントとして追加することです。

protected void myCheckBoxList_DataBound(object sender, EventArgs e) 
    { 
     foreach (ListItem item in myCheckBoxList.Items) 
     { 
      item.Selected = bool.Parse(item.Value); 
     } 
    } 

このソリューションとホセ・バシリオによって提案されたものの違いは、この1つはデータバインディングメソッドのすべての種類で動作するということです。たとえば、v4.5の新しいModelBinding機能を使用してSelectMethodでバインドします。

+0

はい、このソリューションは.NET v4.5で動作しますが、前のバージョンでは動作しません。 – Jony

関連する問題