Domanda

E 'possibile DataBind un ASP.NET CheckBoxList tale che un valore stringa nei dati diventa l'etichetta della casella di controllo e un valore booleano controlli / deseleziona la casella?

Al mio asp.net moduli elettronici Ho un CheckBoxList come questo:

<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" />

Nel codice dietro ho questo codice:

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

Sono stato un pò sperando che le caselle di controllo sarebbero stati controllati quando InRole = true. Ho provato anche InRole = "Controllato". I risultati erano gli stessi. Non riesco a trovare un modo per DataBind e automagicamente hanno le caselle di controllo controllato / incontrollato.

Attualmente mi risolve il problema impostando selezionato = true per le voci appropriate in caso DataBound. Sembra che ci sia una soluzione più pulita appena oltre la mia portata.

Grazie

È stato utile?

Soluzione

Modifica Non c'è modo di farlo attraverso il markup. Il DataValueField non determina se l'oggetto casella di controllo è controllare o meno. Recupera o memorizza il valore da utilizzare in postback. Il DataValueField è comune in tutta CheckBoxLists, RadioButtonLists, ListControl, ecc.

Questo è l'unico modo per pre-selezionare le caselle di controllo come già scoperto.

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

foreach(ListItem item in chkListRoles.Items)
 item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;

Altri suggerimenti

Ho fatto un controllo personalizzato per questo, dopo aver ottenuto stanco del OnItemDataBound vincolante. Essa ti consente di associare l'attributo Selected. Si può facilmente fare lo stesso controllo per RadioButtonList modificando ciò che il controllo personalizzato deriva da.

Per usare questo, è sufficiente aggiungere l'attributo DataCheckedField quando si crea il controllo nel markup. Ricordarsi di fare riferimento ai controlli personalizzati nel web.config file.

Markup

<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles"
                               DataCheckedField="InRole"
                               DataTextField="UserName"
                               DataValueField="UserId" />

codice per il controllo

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

Non è possibile utilizzando il markup. Che cosa si può fare è di impegnare la CheckBoxList come volevi farlo funzionare - con il bool nel DataValueField, e poi semplicemente aggiungere questo come evento OnDataBound.

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

La differenza tra questa soluzione e quello proposto da Jose Basilio è che questo funziona con tutti i tipi di metodi di associazione dati. Per esempio vincolante con un SelectMethod utilizzando la nuova funzionalità ModelBinding in v4.5.

Vorrei pensare che avrebbe dovuto dire al controllo di quale proprietà di legarsi a ... in questo caso "InRole".

ho giocato intorno con esso e sembra che ci sia noway di legarsi alla selezione della casella di controllo, è necessario farlo da soli. Sono stato in grado di legarsi al testo e valori della lista di controllo che sembrano solo a che fare con l'etichetta di ciascuna casella di controllo nell'elenco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top