Подтвердить что ты не робот

ASP.NET CheckBoxList DataBinding Question

Возможно ли 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 и автоматически отмечать или не проверять флажки.

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

Спасибо

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ: Нет способа сделать это через разметку. DataValueField не определяет, проверяется ли элемент флажка или нет. Он извлекает или сохраняет значение, которое будет использоваться в postbacks. 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;

Ответ 2

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

Ответ 3

Невозможно использовать разметку. Что вы можете сделать, так это привязать 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.

Ответ 4

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

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