asp.net web-controls

ASP.NET CheckBoxList pregunta de enlace de datos



web-controls (4)

¿Es posible enlazar un CheckBoxList de ASP.NET de forma tal que un valor de cadena en los datos se convierta en la etiqueta de la casilla de verificación y un valor bool active / desactive la casilla?

En mi formulario web asp.net tengo una CheckBoxList como esta:

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

En el código de 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();

Esperaba que las casillas de verificación estuvieran marcadas cuando InRole = true. También he intentado InRole = "Checked". Los resultados fueron los mismos. Parece que no puedo encontrar una forma de DataBind y tengo las casillas de verificación marcadas / desmarcadas automáticamente.

Actualmente resuelvo el problema configurando selected = true para los elementos apropiados en el evento DataBound. Parece que hay una solución más limpia más allá de mi alcance.

Gracias


Hice un control personalizado para esto, después de cansarme de la vinculación OnItemDataBound . Te permitirá enlazar el atributo Selected . Puede hacer fácilmente el mismo control para RadioButtonList cambiando de lo que deriva el control personalizado.

Para usar esto, simplemente agregue el atributo DataCheckedField cuando cree el control en su marca. Recuerde hacer referencia a los controles personalizados en su archivo web.config .

Margen

<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 utilizar el marcado. Lo que puede hacer es enlazar la lista de casillas de verificación como quisiera que funcionara, con el bool en el DataValueField, y luego simplemente agregar 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 la propuesta por José Basilio es que ésta funciona con todo tipo de métodos de enlace de datos. Por ejemplo, enlace con un método Select utilizando la nueva función ModelBinding en v4.5.


Pensaría que tendrías que decirle al control a qué propiedad se debe enlazar ... en este caso "InRole".

He jugado un poco con él y parece que ahora hay que enlazar a la selección de la casilla de verificación, tienes que hacerlo tú mismo. Pude enlazar el texto y los valores de la lista de verificación que solo parecen tratar con la etiqueta de cada casilla de verificación en la lista.


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

Esta es casi la única forma de preseleccionar las casillas de verificación como ya descubrió.

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