Consulta sobre Checkboxlist

Comenzando el año y comienzo a preguntarte! Jajaj
En un sistema que estoy desarrollando, tengo un checkboxlist que carga los valores de una tabla, al seleccionar cualquiera de ellos tengo el siguiente código:
Dim micampo As String
micampo = ""
For i = 0 To CheckBoxList1.Items.Count - 1
If CheckBoxList1.Items(i).Selected Then 'SI ESTA SELECCIONADO
    micampo = micampo + CheckBoxList1.Items(i).Text + "-" 'ENVÍA EL VALOR AL CAMPO End If
Next
Con esto guardo en un solo campo de otra tabla los valores seleccionados del Checkboxlist junto con otros datos de un establecimiento. Hasta ahí todo bien.
Pero mi consulta es: ¿Cómo hago para hacer lo contrario?. Es decir, leer un registro, y tomar los valores de ese campo y "separarlos" para ponerlos de nuevo en el Checkboxlist y que queden en el check que debe quedar.

1 Respuesta

Respuesta
1
Si te he entendido bien tienes un campo de tipo String que tendrá una serie de valores separados por el carácter "-" y quieres seleccionar los checkboxes cuyo Text esté en el listado de valores, ¿es así?
Para separar el string en subcadenas has de hacer uso del método Split de la clase String:
http://msdn.microsoft.com/es-es/library/b873y76a.aspx
Siguiendo tu caso pongamos por ejemplo que tienes los siguientes valores:
* CheckBoxList con 5 checkboxes cuyo textos van del 1 al 5:
* micampo -> "1-3-4"
Por lo que quieres marcar el primero, tercer y cuarto checkBox.
La estrategia es usar "Split" para hacer "trozos" de micampo separando por "-", buscar qué checkbox tiene relacionado y seleccionarlo:
Dim separador As Char() = {'-'}
Dim micampoSplitted As String() = micampo.Split(separador)
For Each valor As String In micampoSplitted
    For i = 0 To CheckBoxList1.Items.Count - 1
         If CheckBoxList1.Items(i).Text == valor Then
               CheckBoxList1.Items(i).Selected = true
         End If
    Next
Next valor
No es una solución muy elegante (ya que has de hacer un bucle dentro de un bucle y si tienes muchos elementos el rendimiento se verá mermado) pero es funcional.
Gracias por la respuesta.  Sólo tengo una duda.  Estoy usando VWD con Visual Basic y esta parte del código  Dim separador As Char() = {'-'}, no me la reconoce, me da un error, dice que se espera una expresión.  No sé si será por el tipo de separador o por las llaves.
Ahora, pregunto, el tipo Char debe ir con ().
Gracias por tu ayuda.
el separador del Split debe de se run array de char (por eso lo he declarado como Char())
Mirando la documentación del enlace que te he pasado (http://msdn.microsoft.com/es-es/library/b873y76a.aspx) parece que la sintaxis correcta en VB es:
Dim separador As Char() = {"-"c}
Prueba así y me dices
Gracias por la respuesta.
Pues lo intenté y nada.  Cambié los valores en la base de datos, cambié el separador, modifiqué el código según como está en el enlace de microsoft y nada.
No puede haber algún problema con el hecho de tomar los datos del checkboxlist de una tabla? Habrá que recargar el checkboxlist? Digo, porque lo cierto es que no se me ocurre algo... :)
Te agradezco una luz según tu experiencia
Pégame exactamente tu código y el error que te da y te lo miro.
OK vamos por partes.  El Checkbox lo cargo así:
<asp:CheckBoxList ID="CheckBoxList1" runat="server" DataSourceID="SqlDataSource16" DataTextField="mes" DataValueField="registro" Height="18px" Width="248px"> </asp:CheckBoxList> <asp:SqlDataSource ID="SqlDataSource16" runat="server" ConnectionString="<%$ ConnectionStrings:retcpiloto1_DataConnectionString1 %>" SelectCommand="SELECT * FROM [meses]"></asp:SqlDataSource>
Ahí carga un listado de los meses más otras cuatro opciones, todas texto.
Al salvar los datos seleccionados del checkboxlist hago esto:
Dim micampo As String
micampo = ""
For i = 0 To CheckBoxList1.Items.Count - 1
If CheckBoxList1.Items(i).Selected Then 'SI ESTA SELECCIONADO
   micampo = micampo + CheckBoxList1.Items(i).Text + "-" 'ENVÍA EL VALOR AL CAMPO
End If
Next
Se guardan los valores seleccionados como una cadena en un solo campo en la tabla.
Ahora, para hacer lo contrario y según el código que me enviaste hice esto:
Dim micampo As String
micampo = Midataset.Tables(0).Rows(0)("mesproduccion").ToString Dim separador As Char() = {"-"c}
Dim micampoSplitted As String() = micampo.Split(separador)
For Each valor As String In micampoSplitted
   For i = 0 To CheckBoxList1.Items.Count - 1
      If CheckBoxList1.Items(i).Text = valor Then
         CheckBoxList1.Items(i).Selected = True
      End If
   Next
Next valor
Lo varié así:
Dim micampo As String
micampo = Midataset.Tables(0).Rows(0)("mesproduccion").ToString
Dim micamposplitted As String() = micampo.Split(New [Char]() {","c})
For Each valor As String In micampoSplitted
For i = 0 To CheckBoxList1.Items.Count - 1
   If CheckBoxList1.Items(i).Text = valor Then
      CheckBoxList1.Items(i).Selected = True
   End If
Next
Next valor
Y no aparece ningún error, simplemente carga el Checkboxlist con todas las opciones desmarcadas.  :(
¿Qué valor tienes en "micampoSplitted" después de hacer el Split?
jajaja no te rías, pero cómo hago para ver "micamposplitted"??  intenté pasarlo a un Textbox en el formulario pero me da System.String[], algo así.
Además, el separador arriba aparece coma en una parte y guión en otro, pero con ninguno funciona.
Creo que el problema lo tienes aquí:
If CheckBoxList1.Items(i).Text = valor Then
Se compara usando dos símbolos de igual por lo que debería de ser así:
If CheckBoxList1.Items(i).Text == valor Then
Si colocas un punto de ruptura en el Visual Studio en una línea en concreto puedes ver el valor de una variable en ese momento. Coloca un punto de ruptura cuando haces el split (pulsando F9) y podrás ver el valor.
OK, puse el punto de ruptura (cómo he aprendido gracias a ti!!!) y me dice que:
micampo es "enero-febrero"
micamposplitted {Length=2}
enero
febrero
ambos como string
Al parecer está bien.  Incluso valor está como "enero", también como string
Ahora, si en el If le pongo == me da "Expression expected"
Al hacer el debug con un punto de ruptura luego de ese If me da esto:
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dllAn exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user codeA first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dllAn exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code
y después de ahí, puedo seguir utilizando el sistema pero no se pueden ver los valores de las variables
Por lo que parece el split es correcto.
Mira a ver el valor exacto que tienes en "CheckBoxList1.Items(i).Text" y mira si es lo mismo que "valor" (no vaya a ser que se haya colado un espacio o haya alguna mayúscula).
He mirado la sintaxis de VB y, en efecto, se compara solo con un "=" por lo que tu código era correcto.
Revisa eso que te he comentado y me dices.
Hola de nuevo.  Creo que se por dónde va la cosa pero no sé la solución  :)
El mensaje que da es que el indice del checkboxlist está fuera del rango.  Lo que hice fue pasar el primer valor a una variable y verla, y resulta que está vacía por el error anterior.  Estoy implementando esto en el Load de la página y parece que el control no se ha cargado cuando se ejecuta este código.
El asunto es que no sé si ejecutar el código en algún evento del propio control o en alguna otra parte.  ¿Qué me recomiendas?
lo debes ejecutar en el Load(), es correcto.
El error parece que ocurre porque te estás saliendo de los límites del CheckBoxList.
¿Qué linea es la que te falla exactamente? Vamos a ver si logro encontrar el problema.
Pues te cuento que jugando un poco agregué ese código en el evento Prerender del CheckBoxList y funciona a la perfección.
Donde daba el error era cuando intentaba pasar el valor del Checkbox a la variable, al parecer no había cargado el control.
Ahora ya funciona, no sé si quedará práctico pero al menos no se siente sobrecargado el sistema.  
Lo que tengo duda ahora es como saber si un dataset está vacío
micampo = Midataset.Tables(0).Rows(0)("mesproduccion").ToString Dim separador
Finalizo esta pregunta y te la hago en otra?
Gracias por la ayuda, me ha servido de mucho
Si.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas