Pregunta

¿Es posible una databind ASP.NET CheckBoxList tal que un valor de cadena de los datos se convierte en la etiqueta de la casilla de verificación y un valor bool cheques / desactiva la caja?

En mi formulario web asp.net Tengo un CheckBoxList como esto:

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

En el código detrás tengo este código:

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

Me esperaba un poco que las casillas de verificación se comprueban cuando InRole = true. También he intentado InRole = "marcado". Los resultados fueron los mismos. Me parece que no puede encontrar una manera de DataBind y automágicamente tener las casillas controladas / sin marcar.

Actualmente me soluciona el problema estableciendo seleccionada = cierto para los elementos apropiados en caso DataBound. Parece que hay una solución más limpia poco más allá de mi alcance.

Gracias

¿Fue útil?

Solución

EDIT: No hay manera de hacer esto a través del marcado. El DataValueField no determina si el elemento casilla de verificación es comprobar o no. Se recupera o almacena el valor que se utilizará en las devoluciones de datos. El DataValueField es común a través de CheckBoxLists, RadioButtonLists, ListControl, etc.

Esta es la única manera de preseleccionar las casillas de verificación como ya descubierto.

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

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

Otros consejos

Hice un control personalizado para esto, después de cansarse de la OnItemDataBound vinculante. Se le permitirá enlazar el atributo Selected. Usted puede hacer el mismo control para RadioButtonList cambiando lo que el control personalizado se deriva de.

Para utilizarlo, sólo añadir el atributo DataCheckedField cuando se crea el control de su margen de beneficio. Recuerde que debe hacer referencia a los controles personalizados en su web.config archivo.

Marcado

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

código para el control

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

No es posible el uso de marcas. Lo que puede hacer es obligar a la CheckBoxList como usted quería que funcione - con el bool en el DataValueField, y luego sólo tiene que añadir esto como evento OnDataBound.

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

La diferencia entre esta solución y el propuesto por José Basilio es que éste funciona con todo tipo de métodos de enlace de datos. Por ejemplo la unión con una SelectMethod usando la nueva característica ModelBinding en v4.5.

Me gustaría pensar que tendría que decirle al control de los bienes que se una a ... en este caso "InRole".

He jugado un poco con ella y parece que no hay noway para unirse a la selección de la casilla de verificación, usted tiene que hacerlo usted mismo. Yo era capaz de enlazar con el texto y los valores de la lista de verificación que sólo parece que lidiar con la etiqueta de cada casilla de verificación en la lista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top