Corregir o quitar elementos del comBoBox

Iniciado por Meta, 6 Abril 2021, 19:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Quiero añadir unidades detectadas de si hay lectores en un PC o ordenador.

Cada vez que me detecta dos lectores en el comboBox me lo rellena así:

F
:
G
:

Como cuatros elementos cuando en realidad son dos y debe mostrarlos así:
F:
G:

Me da igual si solo también se queda como abajo.
F
G

¿Hay alguna forma de corregir estas cosas?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

K-YreX

Sin tener más datos sobre cómo lo has implementado, la solución más genérica que se me ocurre es comparar si el valor es igual a ":" antes de agregarlo al combobox y en caso afirmativo, ignorar ese elemento.

Viendo el código de esa parte del programa igual se puede obtener una solución más "limpia" por decirlo de alguna manera.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Meta

Lo intenté hacer con remove al comoBox, se borra, pero cuando encuentra otra unidad sigue el problema.

Código (csharp) [Seleccionar]
private void Form1_Load(object sender, EventArgs e)

{
    // Nombre de la unidad.
    ConsigueComponentes("Win32_CDROMDrive", "Id");

    foreach (char item in datos)
    {
        comboBox_Unidad.Items.Add(item);
    }

    // Selecciona la primera unidad.
    comboBox_Unidad.SelectedIndex = 0;

    // Limpiar.
    datos = "";

}
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

K-YreX

Claro, si digamos que en <datos> tienes algo como:
C:D:F:
Y vas recorriendo y agregando carácter a carácter pues agregarás:

C
:
D
:
F
:



Otra solución:
Código (csharp) [Seleccionar]

string[] unidades = datos.Split(':');
foreach(string unidad in unidades)
  combobox.Items.Add(unidad);

Resultado:

C
D
F
G

El delimitador (':') no se incluye en las subcadenas. Para incluirlo puedes hacerlo manualmente:
Código (csharp) [Seleccionar]
combobox.Items.Add(unidad + ":");
O mediante un for() y el método Substring() o similares para recoger dos caracteres en vez de uno.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Meta

No se que pasa.
En vez de verse:

F:
G:

En el comboBox, aparece esto.


Ver imagen.

En este otro código de abajo, solo se me ve así:
G:
:

¿Dónde está la F:?  ;D

Código (csharp) [Seleccionar]
       void UnidadDisco()
       {
           // Nombre de la unidad.
           ConsigueComponentes("Win32_CDROMDrive", "Id");

           // Delimitador.
           string[] unidades = datos.Split(':');

           foreach (string unidad in unidades)
           {
               comboBox_Unidad.Items.Add(unidad + ":");
           }

           // Selecciona la primera unidad.
           comboBox_Unidad.SelectedIndex = 0;
       }


Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Serapis

Es aún más sencillo, en NET muchas colecciones admiten la adicion de un array directamente con 'AddRange', lo que nos evita la necesidad de usar un bucle...

Código (CSHARP) [Seleccionar]

private void button1_Click(object sender, EventArgs e)
       {        
           string[] uds= "C:D:F:G:".Split(':');
           comboBox1.Items.AddRange(uds);

           //comboBox1.Items.AddRange(unidades.Split(':'));  //el Split se puede hacer en una sola linea.
       }


Si además quieres que aparezcan los dos puntos, es preferible modificar el string de entrada, remplazando los dos puntos por los puntos y un espacio (y entonces hacer el Split por el espacio).

Meta

La idea es que me detecte las unidades de disco que tengo instalada o detectada. ;)
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

K-YreX

Cita de: Meta en  7 Abril 2021, 11:01 AM
No se que pasa.
En vez de verse:

F:
G:

En el comboBox, aparece esto.


Ver imagen.

En este otro código de abajo, solo se me ve así:
G:
:

¿Dónde está la F:?  ;D

Código (csharp) [Seleccionar]
       void UnidadDisco()
       {
           // Nombre de la unidad.
           ConsigueComponentes("Win32_CDROMDrive", "Id");

           // Delimitador.
           string[] unidades = datos.Split(':');

           foreach (string unidad in unidades)
           {
               comboBox_Unidad.Items.Add(unidad + ":");
           }

           // Selecciona la primera unidad.
           comboBox_Unidad.SelectedIndex = 0;
       }


Saludos.
Por un lado, no se puede ver la imagen. Ni en el cuadro de imagen ni mediante el enlace de "Ver imagen".
Y por otro lado, si no se muestra correctamente la F tiene que ser porque en la variable <datos> no está bien guardado.
Si el resultado ha sido:

G:
:

tiene que ser porque en <datos> estaba almacenado la siguiente cadena: "G::".

Prueba a imprimir el contenido de <datos> para comprobarlo.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Serapis

Cita de: Meta en  7 Abril 2021, 19:17 PM
La idea es que me detecte las unidades de disco que tengo instalada o detectada. ;)
Usa GetDevices... quizás tengas que añadir una referencia al ensamblado.

Meta

Si lo hago así:
Código (csharp) [Seleccionar]
        void UnidadDisco()
        {
            // Nombre de la unidad.
            ConsigueComponentes("Win32_CDROMDrive", "Id");
           
            // Delimitador.
            string[] unidad = datos.Split(' ');
            comboBox_Unidad.Items.AddRange(unidad);

            //comboBox_Unidad.Items.AddRange(unidades.Split(':'));  //el Split se puede hacer en una sola linea.

            // Selecciona la primera unidad.
            comboBox_Unidad.SelectedIndex = 0;
        }


Me di cuenta que en dato primero pone F:
Luego hace otra pasada en el código de abajo.
Código (csharp) [Seleccionar]
        void ConsigueComponentes(string hwclass, string syntax)
        {
            ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
            foreach (ManagementObject mj in mos.Get())
            {
                if (Convert.ToString(mj[syntax]) != "")
                {
                    datos = Convert.ToString(mj[syntax]);
                }
            }
        }


Y se pone en G: borrando la F:
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/