ASP.NET CheckBoxList Вопрос о привязке данных - PullRequest
26 голосов
/ 18 мая 2009

Можно ли привязать DataBind к ASP.NET CheckBoxList так, чтобы строковое значение в данных становилось меткой флажка, а значение bool проверяет / снимает флажок?

В моей веб-форме asp.net у меня есть 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 = "Проверено". Результаты были одинаковыми. Я не могу найти способ для DataBind и автоматически установить / снять флажки.

В настоящее время я решаю проблему, установив selected = true для соответствующих элементов в событии DataBound. Похоже, что есть более чистое решение за пределами моего понимания.

Спасибо

Ответы [ 4 ]

38 голосов
/ 19 мая 2009

РЕДАКТИРОВАТЬ: Нет никакого способа сделать это через разметку. 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;
9 голосов
/ 22 июня 2011

Я сделал пользовательский контроль для этого, после того как устал от привязки 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);
            }
        }
    }
}
5 голосов
/ 06 декабря 2011

Это невозможно при использовании разметки. Что вы можете сделать, это связать список флажков, как вы хотели, чтобы он работал - с помощью bool в DataValueField, а затем просто добавить это как событие OnDataBound.

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

Разница между этим решением и предложенным Хосе Базилио заключается в том, что оно работает со всеми видами методов привязки данных. Например, связывание с SelectMethod с использованием новой функции ModelBinding в v4.5.

0 голосов
/ 18 мая 2009

Я бы подумал, что вы должны указать элементу управления, к какому свойству его привязать ... в этом случае "InRole"

Я поэкспериментировал с этим и, похоже, сейчас есть возможность привязать выбор флажка, вы должны сделать это самостоятельно. Мне удалось связать текст и значения контрольного списка, которые, кажется, имеют дело только с ярлыком каждого флажка в списке.

...