none
Problema con ListBox Registry GetValue RRS feed

  • Pregunta

  • Hola.

    Estoy intentando obtener los datos de un valor multistring del registro de Windows directamente en un Listbox ,pero no funciona bien.

            Dim rgsk = Registry.CurrentUser.OpenSubKey("Software\\SubKey", True)
            If rgsk Is Nothing Then
                rgsk = Registry.CurrentUser.CreateSubKey("Software\\SubKey")
            End If
            Dim stvl() As String = DirectCast(rgsk.GetValue("Value", Nothing), String())
            listbox1.Items.AddRange(stvl)
    

    Después de iniciar la depuración, en el ListBox se escribe una sola línea vacía.

    Pero, si además, añado lo siguiente sí que consigo los datos. Pero lo que necesito es obtener esos datos directamente en un ListBox.

    RichTextBox1.Lines = (From itms In listbox1.Items Let ostr = itms.ToString Select ostr).ToArray

    Gracias por la ayuda que puedan prestar.


    Rafael FM

    jueves, 23 de junio de 2016 22:53

Respuestas

  • "RafaelFM" escribió:

    > Tal vez sea por el método setvalue...
    >
    > rk.SetValue("Value", New String() {String.Join(vbCrLf, listbox2.Items.Cast(Of String).ToArray)})

    Hola, Rafael:

    Yo también entiendo que es por el valor que le estás pasando al método SetValue, ya que lo que estás haciendo con el método String.Join es concatenar los valores de los elementos existentes en el control ListBox, por lo que el resultado final será una cadena alfanumérica, no una matriz (array) de valores alfanuméricos.

    Tampoco estaría de más que al método SetValue le indicaras el tipo de datos que se van a almacenar en el registro.

    Para escribir en el registro un valor MultiString con los valores existentes en un control ListBox:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Ruta de la subclave
            Dim subKey As String = "Software\SubKey"
    
            Dim rk As RegistryKey = Nothing
    
            Try
                ' Intentamos abrir la clave.
                '
                rk = Registry.CurrentUser.OpenSubKey(subKey, True)
                If (rk Is Nothing) Then
                    ' Si no existe, creamos la subclave.
                    rk = Registry.CurrentUser.CreateSubKey(subKey)
                End If
    
                ' Escribir la matriz de valores alfanuméricos, indicando
                ' el tipo de datos que se va a almacenar.
                '
                rk.SetValue("Value", ListBox2.Items.Cast(Of String).ToArray(), RegistryValueKind.MultiString)
    
            Finally
                ' Siempre cerrar la clave para liberar los recursos utilizados,
                ' se haya o no producido un error.
                '
                If (Not rk Is Nothing) Then
                    rk.Close()
                End If
    
            End Try
    
        End Sub
    

    Y para leer el valor y mostrarlo en un control ListBox, ejecutarías lo siguiente:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            ' Ruta de la subclave
            Dim subKey As String = "Software\SubKey"
    
            ' Abrir la clave.
            '
            Dim rk As RegistryKey = Nothing
    
            Try
                ' Abrir la subclave
                rk = Registry.CurrentUser.OpenSubKey(subKey)
                If (Not rk Is Nothing) Then
                    ' Si existe, leer los valores.
                    rk = Registry.CurrentUser.CreateSubKey(subKey)
                End If
    
                Dim stvl() As String = DirectCast(rk.GetValue("Value", Nothing), String())
                ListBox2.Items.AddRange(stvl)
    
            Finally
                ' Siempre cerrar la clave para liberar los recursos utilizados,
                ' se haya o no producido un error.
                '
                If (Not rk Is Nothing) Then
                    rk.Close()
                End If
    
            End Try
    
        End Sub
    

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta RafaelFM sábado, 25 de junio de 2016 18:04
    • Desmarcado como respuesta RafaelFM sábado, 25 de junio de 2016 18:20
    • Marcado como respuesta RafaelFM sábado, 25 de junio de 2016 19:04
    sábado, 25 de junio de 2016 8:09
    Moderador

Todas las respuestas

  • Tal vez sea por el método setvalue...

            Dim rk As RegistryKey = Registry.CurrentUser.CreateSubKey("Software\SubKey")
            rk.SetValue("Value", New String() {String.Join(vbCrLf, listbox2.Items.Cast(Of String).ToArray)})
            rk.Close()


    Rafael FM

    viernes, 24 de junio de 2016 0:54
  • Por ahora, lo mejor que he conseguido es guardar el registro a un archivo temporal y pasarlo a un ListBox

    Dim rgsk = Registry.CurrentUser.OpenSubKey("Software\\w10cln", True)
    If rgsk Is Nothing Then
        rgsk = Registry.CurrentUser.CreateSubKey("Software\\w10cln")
    End If
    Dim pths As String = System.Environment.CurrentDirectory & "\Archivo\w10cln\"
    Dim lnes = (DirectCast(rgsk.GetValue("cksg", Nothing), String()))
    Dim nlvc = lnes.Where(Function(lins) Not [String].IsNullOrWhiteSpace(lins)).ToArray()
    'ESCRIBIR GETVALUE EN UN ARCHIVO
    Dim bfer As Byte() = Encoding.Default.GetBytes(nlvc(0))
    Dim ms As New MemoryStream(bfer)
    Dim file As New FileStream(pths & "mrst.txt", FileMode.Create, FileAccess.Write)
    ms.WriteTo(file)
    file.Close()
    ms.Close()
    LbxIzquierdo.Items.AddRange(IO.File.ReadAllText(pths & "mrst.txt").Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries))
    


    Rafael FM

    viernes, 24 de junio de 2016 7:20
  • "RafaelFM" escribió:

    > Tal vez sea por el método setvalue...
    >
    > rk.SetValue("Value", New String() {String.Join(vbCrLf, listbox2.Items.Cast(Of String).ToArray)})

    Hola, Rafael:

    Yo también entiendo que es por el valor que le estás pasando al método SetValue, ya que lo que estás haciendo con el método String.Join es concatenar los valores de los elementos existentes en el control ListBox, por lo que el resultado final será una cadena alfanumérica, no una matriz (array) de valores alfanuméricos.

    Tampoco estaría de más que al método SetValue le indicaras el tipo de datos que se van a almacenar en el registro.

    Para escribir en el registro un valor MultiString con los valores existentes en un control ListBox:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Ruta de la subclave
            Dim subKey As String = "Software\SubKey"
    
            Dim rk As RegistryKey = Nothing
    
            Try
                ' Intentamos abrir la clave.
                '
                rk = Registry.CurrentUser.OpenSubKey(subKey, True)
                If (rk Is Nothing) Then
                    ' Si no existe, creamos la subclave.
                    rk = Registry.CurrentUser.CreateSubKey(subKey)
                End If
    
                ' Escribir la matriz de valores alfanuméricos, indicando
                ' el tipo de datos que se va a almacenar.
                '
                rk.SetValue("Value", ListBox2.Items.Cast(Of String).ToArray(), RegistryValueKind.MultiString)
    
            Finally
                ' Siempre cerrar la clave para liberar los recursos utilizados,
                ' se haya o no producido un error.
                '
                If (Not rk Is Nothing) Then
                    rk.Close()
                End If
    
            End Try
    
        End Sub
    

    Y para leer el valor y mostrarlo en un control ListBox, ejecutarías lo siguiente:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            ' Ruta de la subclave
            Dim subKey As String = "Software\SubKey"
    
            ' Abrir la clave.
            '
            Dim rk As RegistryKey = Nothing
    
            Try
                ' Abrir la subclave
                rk = Registry.CurrentUser.OpenSubKey(subKey)
                If (Not rk Is Nothing) Then
                    ' Si existe, leer los valores.
                    rk = Registry.CurrentUser.CreateSubKey(subKey)
                End If
    
                Dim stvl() As String = DirectCast(rk.GetValue("Value", Nothing), String())
                ListBox2.Items.AddRange(stvl)
    
            Finally
                ' Siempre cerrar la clave para liberar los recursos utilizados,
                ' se haya o no producido un error.
                '
                If (Not rk Is Nothing) Then
                    rk.Close()
                End If
    
            End Try
    
        End Sub
    

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta RafaelFM sábado, 25 de junio de 2016 18:04
    • Desmarcado como respuesta RafaelFM sábado, 25 de junio de 2016 18:20
    • Marcado como respuesta RafaelFM sábado, 25 de junio de 2016 19:04
    sábado, 25 de junio de 2016 8:09
    Moderador
  • Gracias por la respuesta Enrique M. Montejo

    Pero sigue pasando lo mismo. En el ListBox1, en una sola línea vacía, seguramente se escriben los datos, pero no pueden apreciarse.

    Si selecciono esa línea vacía para leer lo que contiene y escribirlo en un control TextBox, en este, se escribe la primera línea de la lista pero, eso es todo.

    Gracias de nuevo.

     


    Rafael FM

    sábado, 25 de junio de 2016 18:29
  • Una observación. Utilizo Visual Studio Express 2015 Update 2 y Windows 10 Home.


    Rafael FM

    sábado, 25 de junio de 2016 18:32
  • "RafaelFM" escribió:

    > Pero sigue pasando lo mismo. En el ListBox1, en una sola línea vacía,
    > seguramente se escriben los datos, pero no pueden apreciarse.
    >

    Lamento decirte que yo no puedo decir lo mismo, porque con el código fuente que te he indicado anteriormente, se escribe en el registro, como valor MultiString, todos los elementos existentes en un control ListBox.

    Y cuando se pulsa el Button2, se leen los valores del registro y se insertan como elementos en el control ListBox, simplemente ejecutando:

        Dim stvl() As String = DirectCast(rk.GetValue("Value", Nothing), String())
        ListBox2.Items.AddRange(stvl)

    Y si deseas mostrar los valores en un control TextBox (con su propiedad Multiline establecida a True, y el de su propiedad ScrollBars a Vertical), ejecutarías posteriormente ésto otro:

            ' Mostramos los valores en un control TextBox multilínea
            '
            For Each item As String In stvl
                TextBox1.AppendText($"{item}{Environment.NewLine}")
            Next

    Y en cada línea del control TextBox te debería de aparecer un valor como me aparece a mí. Observa que tienes que insertar un salto de línea (Environment.NewLine) para que el siguiente valor se escriba en otra línea diferente.

    > Una observación. Utilizo Visual Studio Express 2015 Update 2 y Windows 10 Home.

    Ignoro lo que te puede estar pasando, pero dudo mucho que se deba a las versiones de Visual Studio y de Windows que estás utilizando.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    sábado, 25 de junio de 2016 18:52
    Moderador
  • Perdone Enrique M. Montejo

    Lo que pasaba es que no había escrito el valor con la nueva solución que ofrece.

    Sino que leía el valor escrito con el código anterior.

    Solucionada la cuestión.

    Muchas gracias.


    Rafael FM

    sábado, 25 de junio de 2016 19:04