none
Eliminar controles según criterio RRS feed

  • Question

  • Hola.

    Tengo una palabra, ("ORDEN"), y ocho controles con Text que, forman la palabra ("ORDENADO")

    Mi pregunta es: Como puedo eliminar los que tienen como text las letras O, R, D, E, N sin eliminar las demás?

    Lo siguiente es lo que tengo por ahora.

            'Dim curname As String = "Btn1"
            'Dim curtags() As String = {"A"}
            For Each ctrs1 As Panel In pnls.Controls
                For Each btns1 As Button In ctrs1.Controls
                    For i = ctrs1.Controls.Count - 1 To 0 Step -1
    
                        If ctrs1.Controls(i).Tag = TbxFocus.Text(Mid(0, 1)) And ctrs1.Controls(i).Tag = TbxFocus.Text(Mid(1, 1))  And ctrs1.Controls(i).Tag = TbxFocus.Text(Mid(2, 1)) _
                        And ctrs1.Controls(i).Tag = TbxFocus.Text(Mid(3, 1)) And ctrs1.Controls(i).Tag = TbxFocus.Text(Mid(4, 1))  Then
                            ctrs1.Controls.RemoveAt(i)
                        End If
    
                        'Dim lst As New List(Of Control)()
                        'For Each obj As Object In ctrs1.Controls
                        '    If TypeOf obj Is Control Then
                        '        lst.Add(DirectCast(obj, Control))
                        '    End If
                        'Next obj
                        'For Each uc As Control In lst
                        '    uc.Dispose()
                        'Next uc
    
                    Next
                Next
            Next

    Pero no funciona prque los AND se refieren a una sola cadena.

    Gracias por la ayuda.


    • Edited by Rafael F.M Friday, July 3, 2020 7:08 AM
    Thursday, July 2, 2020 4:38 PM

All replies

  • Hola:
    >  ocho Buttons con Text que forman la palabra ("ORDENADO")  <
    ¿Como diferencias los 2 botones con Text=O y los 2 botones con Text=D?

    Un saludo desde Bilbo
    Carlos
    Thursday, July 2, 2020 5:10 PM
  • Hola Rafael F.M,

    Por favor, bríndanos más información sobre como identificas a cada uno de los botones y sobre en qué momento te gustaría borrar los botones. Si el borrarlos depende de un evento o se rige por otras reglas.

    Saludos cordiales

    Gabriel Castro

    Thursday, July 2, 2020 10:20 PM
    Moderator
  • ...Rafman.
    Muchas gracias por su interés y respuestas.

    En un panel con 64 paneles mas, como el tablero del ajedrez, voy arrastrando controles con letras aleatorias y, creados con código, para ir formando palabras horizontalmente. Si, se cree haber conseguido alinear alguna, hay otro botón para verificarla. (Opción del programador). Si la palabra existe en cierta lista, automáticamente se debería de eliminar los botones que contiene la letras de esa palabra.
    Es un juego que estoy haciendo. Pero me falta eliminar eso botones con un algoritmo para reducir el código. Puedo, conseguir lo que necesito, creo. Edito: Ahora sí, pero el código se hace demasiado extenso. Aunque, si no obtengo ayuda, prefiero que sea de esta última forma, a que no sea.

    ...Por eso, me cuesta crear los algoritmos con variables para reducir el código, que es lo que puedo intentar hacer hasta ahora. De otra forma mejor, casi ni pensarlo.

    Gracias de nuevo.

    Edito. Variables de lo que genera los controles. ...De ésto se trata!

    Si lo recreas lo regalas! Aunque contenga variantes. Así menos pagan.










    • Edited by Rafael F.M Friday, July 3, 2020 8:35 AM
    Friday, July 3, 2020 12:43 AM
  • Hola Rafael,


    Entiendo. ¿Utilizas algún identificador para estos botones o simplemente los instancias en tu código? Como J. Carlos preguntaba, ¿de que manera diferencias a los botones entre sí en tu código?

    Saludos cordiales

    Gabriel Castro

    Friday, July 3, 2020 11:19 PM
    Moderator
  • Hola Rafael,


    Entiendo. ¿Utilizas algún identificador para estos botones o simplemente los instancias en tu código? Como J. Carlos preguntaba, ¿de que manera diferencias a los botones entre sí en tu código?

    Saludos cordiales

    Gabriel Castro

    Gracias por tu interés.

    Lo hago por el camino largo. No se hacerlo de otro modo.

    El identificador que uso, creo que es lo que preguntas, el el Tag del control.

    Dejo lo siguiente como ejemplo para que si alguien quiere echarme una mano para hacerlo mejor se preste.

    Dim c1, c2, c3, c4, c5, c6, c7, c8 As String ' Variables para reducir el códigp
    Dim sw = From word In Juego.HhStTg.ToArray Order By word.Length Descending 'HashSet(Of String) con ciertas letras que cada control a eliminar tiene el su Tag.
    Dim ln1 = sw(0)
    
    Dim p1 = Juego.Pnl11.Controls, p2 = Juego.Pnl12.Controls'...
    
    If p1.Count > 0 Then c1 = p1(0).Tag Else c1 = "-" 
    If p2.Count > 0 Then c2 = p2(0).Tag Else c2 = "-" 'No es una letra pero no así no provoca un error por estar vacio
    
    If ln1.Length = 8 Then 'La siguiente línea es para comparar, en orden de primero a último, el tag del primer control con la primera letra de la palabra del HashSet, el segundo con la segunda etc.
        If c1 = ln1(Mid(0, 1)) And c2 = ln1(Mid(1, 1)) And c3 = ln1(Mid(2, 1)) And c4 = ln1(Mid(3, 1)) And c5 = ln1(Mid(4, 1)) And c6 = ln1(Mid(5, 1)) And c7 = ln1(Mid(6, 1)) And c8 = ln1(Mid(7, 1)) Then
            varremove = c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ' Variable para otras cosas
            p1.RemoveAt(0) : p2.RemoveAt(0) : p3.RemoveAt(0) : p4.RemoveAt(0) : p5.RemoveAt(0) : p6.RemoveAt(0) : p7.RemoveAt(0) : p8.RemoveAt(0)
        End If
    End If
    'Etc...
    If ln1.Length = 7 Then
        If c1 = ln1(Mid(0, 1)) And c2 = ln1(Mid(1, 1)) And c3 = ln1(Mid(2, 1)) And c4 = ln1(Mid(3, 1)) And c5 = ln1(Mid(4, 1)) And c6 = ln1(Mid(5, 1)) And c7 = ln1(Mid(6, 1)) Then
            varremove = c1 + c2 + c3 + c4 + c5 + c6 + c7
            p1.RemoveAt(0) : p2.RemoveAt(0) : p3.RemoveAt(0) : p4.RemoveAt(0) : p5.RemoveAt(0) : p6.RemoveAt(0) : p7.RemoveAt(0)
        End If
        If c2 = ln1(Mid(0, 1)) And c3 = ln1(Mid(1, 1)) And c4 = ln1(Mid(2, 1)) And c5 = ln1(Mid(3, 1)) And c6 = ln1(Mid(4, 1)) And c7 = ln1(Mid(5, 1)) And c8 = ln1(Mid(6, 1)) Then
            varremove = c2 + c3 + c4 + c5 + c6 + c7 + c8
            p2.RemoveAt(0) : p3.RemoveAt(0) : p4.RemoveAt(0) : p5.RemoveAt(0) : p6.RemoveAt(0) : p7.RemoveAt(0) : p8.RemoveAt(0)
        End If
    End If
    ' Asi, sucesivamente, hasta completar lo que necesito.

    Monday, July 6, 2020 9:27 PM
  • Hola Rafael F.M,

    Estuve investigando tu problema y encontré esto, espero que te ayude.

    * Al crear los controles, mantén las referencias alrededor. Por ejemplo, puedes usar una lista como variable global.

    Dim MyControls as List(Of Control)

    Cuando crees los controles, los agregas a la colección de controles del formulario y también a la lista

    MyControls = New List(Of Control)
    [...]
    Me.Controls.Add(NewControl)
    MyControls.Add(NewControl)

    Elimina los controles que eliminas del formulario y deséchelos (libera recursos)

    For each c as Control in MyControls
      Me.Controls.Remove(c)
      c.Dispose()
    Next


    Puedes hacer esto porque los controles son tipos de referencia. Eso significa que los objetos tanto en la lista MyControls como en los que se muestran en el formulario apuntan a la misma instancia y, por lo tanto, puedes eliminarlos fácilmente después.

    Saludos cordiales

     

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Thursday, July 9, 2020 7:46 PM
    Moderator
  • Hola Rafael F.M

     

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

     

    Espero tu respuesta.  

     

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

     

    Gracias por usar los foros de MSDN.  

     

    Gabriel Castro

    Tuesday, July 14, 2020 7:51 PM
    Moderator
  • Hola Rafael F.M,

    Estuve investigando tu problema y encontré esto, espero que te ayude.

    * Al crear los controles, mantén las referencias alrededor. Por ejemplo, puedes usar una lista como variable global.    ...

    Los controles, los creo dinámicamente en un Panel para, después poder moverlos (AllowDrop) a otros Panel.

    Si fabrico esos controles en un List(Of Control) que, la verdad lo estoy pensando, tendría que pasarlos al susodicho Panel. Después, tendría que eliminarlos del List y de los Panel donde se visualizan para poder interactuar con éllos. Creo que, por ahora lo dejo como lo tengo, hasta que termine y empiece a repasar el código. Ahora mísmo esta todo muy liado para ir probando'V'.

    Te agradezco el interés!

    Edito: Creo haberte entendido!


    • Edited by Rafael F.M Tuesday, August 4, 2020 2:48 PM
    Sunday, August 2, 2020 11:40 AM