ASP.NET CheckBoxList データバインディングの質問
-
22-08-2019 - |
質問
データ内の文字列値がチェック ボックスのラベルになり、ブール値がボックスをオン/オフにするように ASP.NET CheckBoxList をデータバインドすることは可能ですか?
私のasp.net Webフォームには次のようなCheckBoxListがあります。
<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" />
背後のコードには次のコードがあります。
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();
InRole = true のときにチェックボックスがオンになることをちょっと期待していました。InRole = "Checked" も試してみました。結果は同じでした。DataBind してチェック ボックスを自動的にオン/オフにする方法が見つからないようです。
現在、DataBound イベントの適切な項目に対して selected = true を設定することで問題を解決しています。私の理解を超えた、よりクリーンな解決策があるようです。
ありがとう
解決
編集: マークアップを通じてこれを行う方法はありません。DataValueField は、チェックボックス項目がチェックされているかどうかを決定しません。ポストバックで使用される値を取得または保存します。の データ値フィールド これは、CheckBoxList、RadioButtonList、ListControl などで共通です。
すでにご存知のとおり、これがチェックボックスを事前に選択するほぼ唯一の方法です。
chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();
foreach(ListItem item in chkListRoles.Items)
item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;
他のヒント
飽きたので、このためにカスタム コントロールを作成しました。 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);
}
}
}
}
これは、マークアップを使用してはできません。 DataValueFieldでBOOLで、その後、単にOnDataBoundイベントとしてこれを追加する - あなたはどうすることができますすることは、それが動作するように望んでいたようにCheckBoxListのをバインドすることです。
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との結合ます。
私は、この場合「InRole」に...あなたはそれをバインドするためにどのようなプロパティコントロールを伝えなければならないだろうと思うだろう。
私はそれで遊んとチェックボックスの選択に結合するnowayがあるように、あなたはそれを自分で行う必要がありそうです。私は、リスト内の各チェックボックスのラベルに対処するように見えるテキストやチェックリストの値に結合することができた。