web-dev-qa-db-ja.com

ASP.NET CheckBoxList DataBindingに関する質問

データ内の文字列値がチェックボックスのラベルになり、ブール値がボックスをオン/オフにするようにASP.NET CheckBoxListをDataBindすることは可能ですか?

私の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を設定することで問題を解決しています。私の手に負えないほどきれいな解決策があるようです。

ありがとうございました

26
Matthew Sposato

編集:マークアップを使用してこれを行う方法はありません。 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;
38
Jose Basilio

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);
            }
        }
    }
}
9
sshow

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

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

このソリューションとJose Basilioによって提案されたソリューションとの違いは、このソリューションがあらゆる種類のデータバインディングメソッドで機能することです。たとえば、v4.5の新しいModelBinding機能を使用したSelectMethodとのバインド。

5
Niklas Jonsson

バインドするプロパティをコントロールに指示する必要があると思います...この場合は「InRole」。

私はそれをいじってみましたが、チェックボックスの選択にバインドする方法がないようです。自分で行う必要があります。リストの各チェックボックスのラベルのみを処理するように見えるチェックリストのテキストと値にバインドすることができました。

0
CSharpAtl