29

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

私のasp.netWebフォームには、次のような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を設定することで、問題を解決しています。私の理解を超えたよりクリーンな解決策があるようです。

ありがとうございました

4

5 に答える 5

42

編集:マークアップを介してこれを行う方法はありません。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;
于 2009-05-18T20:12:00.300 に答える
10

バインディングに飽きた後、これをカスタムコントロールしました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);
            }
        }
    }
}
于 2011-06-22T19:16:15.670 に答える
6

マークアップを使用することはできません。できることは、チェックボックスリストを希望どおりにバインドすることです。DataValueFieldのboolを使用して、これをOnDataBoundイベントとして追加するだけです。

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

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

于 2011-12-06T04:00:17.770 に答える
0

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

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

于 2009-05-18T19:49:19.597 に答える
0

を使用するDataListことは別のオプションである可能性があります

<asp:DataList ID="dataListRoles" runat="server">
    <ItemTemplate>
        <asp:CheckBox runat="server" Text='<%# Eval("UserName ") %>' Checked='<%# Eval("IsInRole") %>' />
    </ItemTemplate>
</asp:DataList>
于 2021-06-28T23:00:29.647 に答える