• Welcome to Test Foro de elhacker.net SMF 2.1.
 

Corregir o quitar elementos del comBoBox

Started by Meta, 6 April 2021, 19:33 PM

0 Members and 1 Guest are viewing this topic.

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.
Code (cpp) Select

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.

Code (csharp) Select
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:
Code (csharp) Select

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:
Code (csharp) Select
combobox.Items.Add(unidad + ":");
O mediante un for() y el método Substring() o similares para recoger dos caracteres en vez de uno.
Code (cpp) Select

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

Code (csharp) Select
       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...

Code (CSHARP) Select

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

Quote from: Meta on  7 April 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

Code (csharp) Select
       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.
Code (cpp) Select

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

Serapis

Quote from: Meta on  7 April 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í:
Code (csharp) Select
        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.
Code (csharp) Select
        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/