ASP.NET Вопрос о привязке данных к списку флажков

StackOverflow https://stackoverflow.com/questions/879434

  •  22-08-2019
  •  | 
  •  

Вопрос

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

В моей веб-форме asp.net У меня есть список флажков, подобный этому:

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

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

Спасибо

Это было полезно?

Решение

Редактировать: Нет никакого способа сделать это через Разметку.Поле DataValueField не определяет, является ли элемент checkbox проверяемым или нет.Он извлекает или сохраняет значение, которое будет использоваться при обратной передаче.В Поле значений данных является общим для CheckBoxLists, RadioButtonLists, 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.конфигурация файл.

Разметка

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

Это невозможно с помощью разметки.Что вы можете сделать, так это привязать checkboxlist так, как вы хотели, чтобы он работал - с 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 в версии 4.5.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top