elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Corregir o quitar elementos del comBoBox
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Corregir o quitar elementos del comBoBox  (Leído 850 veces)
K-YreX


Desconectado Desconectado

Mensajes: 874



Ver Perfil
Re: Corregir o quitar elementos del comBoBox
« Respuesta #10 en: 7 Abril 2021, 23:52 pm »

Claro, entonces el problema estaba en que no se estaba guardando en <datos> todas las unidades sino que se van sobreescribiendo en cada iteración. Entonces tienes que concatenar todo y preferiblemente como dice Serapis añadiendo un espacio entre cada unidad para separarlos mediante el espacio y mantener los dos puntos...
Código
  1. datos += mj[syntax].ToString() + " ";
  2. ...
  3. string[] unidades = datos.Split(' ');


En línea

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


Desconectado Desconectado

Mensajes: 3.265



Ver Perfil WWW
Re: Corregir o quitar elementos del comBoBox
« Respuesta #11 en: 8 Abril 2021, 01:29 am »

Funciona mejor, casi perfecto.  ;-) ;-) ;-) ;-) ;-) ;-)

Ahora pone:
G:
F:
Espacio enblanco

No se que pinta en el último elemento un espacio en blanco, queda feo.

Solo hace falta corregir ese último detalle.

Lo demás, perfecto.

 :silbar: :silbar: :silbar: :silbar: :silbar:


En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
[D]aniel


Conectado Conectado

Mensajes: 431



Ver Perfil
Re: Corregir o quitar elementos del comBoBox
« Respuesta #12 en: 8 Abril 2021, 02:29 am »

Hola, si aparece una línea vacía al final del combobox debe ser porque hay un salto de línea al final del string, algo como:

C:D:E:F:\n

o también puede ser porque el Split no está operando como debería o puede que el código esté detectando una unidad que no existe.


Saludos
« Última modificación: 8 Abril 2021, 02:31 am por [D]aniel » En línea

Meta


Desconectado Desconectado

Mensajes: 3.265



Ver Perfil WWW
Re: Corregir o quitar elementos del comBoBox
« Respuesta #13 en: 8 Abril 2021, 11:40 am »

Buenas gente:

Desde que llegue en el depurador hasta aquí indicado.

Código
  1.        void UnidadDisco()
  2.        {
  3.            // Nombre de la unidad.
  4.            ConsigueComponentes("Win32_CDROMDrive", "Id");
  5.  
  6.            // Delimitador.
  7.            string[] unidad = datos.Split(' ');
  8.            comboBox_Unidad.Items.AddRange(unidad);
  9.  
  10.  
  11.            //comboBox_Unidad.Items.AddRange(unidades.Split(':'));  //el Split se puede hacer en una sola linea.
  12.  
  13.            // Selecciona la primera unidad.
  14.            comboBox_Unidad.SelectedIndex = 0;
  15.        }

Se añade un espacio por la cara.


Saludos.
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
[D]aniel


Conectado Conectado

Mensajes: 431



Ver Perfil
Re: Corregir o quitar elementos del comBoBox
« Respuesta #14 en: 8 Abril 2021, 16:25 pm »

Hola, prueba a poner al final del Split:

Código:
System.StringSplitOptions.RemoveEmptyEntries

o

Código:
StringSplitOptions.RemoveEmptyEntries

Eso lo tenés que poner como parámetro en tu Split();.


Saludos
En línea

K-YreX


Desconectado Desconectado

Mensajes: 874



Ver Perfil
Re: Corregir o quitar elementos del comBoBox
« Respuesta #15 en: 8 Abril 2021, 20:24 pm »

Exactamente, como dice [D]aniel se soluciona.
Como estás añadiendo un espacio después de cada unidad, te queda una cadena como esta (sustituyo cada espacio por un _):
Código:
datos = "G:_F:_"
Primer Split -> "G:" (parte izquierda) + "F:_" (parte derecha)
Segundo Split -> "G:" + "F:" (parte izquierda) + "" (parte derecha)
Por eso al final queda un último elemento que es una cadena vacía. Porque es lo que queda a la derecha del último espacio.

Otra solución válida es:
Código
  1. datos = ... // datos = "G:_F:_"
  2. datos = datos.Trim(); // Elimina espacios iniciales y finales -> datos = "G:_F:"
  3. string[] unidades = datos.Split(' ');
En línea

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


Desconectado Desconectado

Mensajes: 3.265



Ver Perfil WWW
Re: Corregir o quitar elementos del comBoBox
« Respuesta #16 en: 9 Abril 2021, 22:51 pm »

Funciona.
Código
  1.        void UnidadDisco()
  2.        {
  3.            // Nombre de la unidad.
  4.            ConsigueComponentes("Win32_CDROMDrive", "Id");
  5.  
  6.            datos = datos.Trim();
  7.  
  8.            // Delimitador.
  9.            string[] unidad = datos.Split(' ');
  10.            comboBox_Unidad.Items.AddRange(unidad);
  11.  
  12.  
  13.            //comboBox_Unidad.Items.AddRange(unidades.Split(':'));  //el Split se puede hacer en una sola linea.
  14.  
  15.            // Selecciona la primera unidad.
  16.            comboBox_Unidad.SelectedIndex = 0;
  17.        }

Me he dado cuenta que en el otro programa más grande no.

Ya no me dice si tiene disco o no.
Código
  1. using System;
  2. using System.Management; // No olvidar y añadir en Dependencias, NuGet.
  3. using System.Runtime.InteropServices;
  4. using System.Text;
  5. using System.Windows.Forms;
  6.  
  7. namespace Lector_discos_Net_5_01_cs
  8. {
  9.    public partial class Form1 : Form
  10.    {
  11.        public Form1()
  12.        {
  13.            InitializeComponent();
  14.        }
  15.  
  16.        // Variable.
  17.        string datos = "";
  18.  
  19.        [DllImport("winmm.dll")]
  20.        public static extern Int32 mciSendString(string lpstrCommand,
  21.            StringBuilder lpstrReturnString,
  22.            int uReturnLength,
  23.            IntPtr hwndCallback);
  24.  
  25.        StringBuilder rt = new StringBuilder(127);
  26.  
  27.        private void button_Abrir_Click(object sender, EventArgs e)
  28.        {
  29.            label_Mensaje.Text = "Abriendo...";
  30.            Application.DoEvents();
  31.            mciSendString("set CDAudio!" + comboBox_Unidad.Text + " door open", rt, 127, IntPtr.Zero);
  32.  
  33.            /*
  34.                Si quieres por ejemplo elegir la unidad que quieras, en este caso la H, se le asigana !H
  35.                como indica abajo. En vez de CDAudio, CDAudio!H.
  36.                mciSendString("set CDAudio!H door open", rt, 127, IntPtr.Zero);
  37.             */
  38.  
  39.            label_Mensaje.Text = "Abierto.";
  40.            discoSiNo();
  41.        }
  42.  
  43.        private void button_Cerrar_Click(object sender, EventArgs e)
  44.        {
  45.            label_Mensaje.Text = "Cerrando...";
  46.            Application.DoEvents();
  47.            mciSendString("set CDAudio!" + comboBox_Unidad.Text + " door closed", rt, 127, IntPtr.Zero);
  48.            label_Mensaje.Text = "Cerrado.";
  49.            label_Mensaje_disco.Text = "Disco en el lector: Leyendo...";
  50.            discoSiNo();
  51.        }
  52.  
  53.        // Lectura de dispositivos.
  54.        void ConsigueComponentes(string hwclass, string syntax)
  55.        {
  56.            ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
  57.            foreach (ManagementObject mj in mos.Get())
  58.            {
  59.                if (Convert.ToString(mj[syntax]) != "")
  60.                {
  61.                    //datos = Convert.ToString(mj[syntax]);
  62.                    datos += Convert.ToString(mj[syntax]).ToString() + " ";
  63.                }
  64.            }
  65.        }
  66.  
  67.        // Comprobar si hay disco en el lector.
  68.        void discoSiNo()
  69.        {
  70.            // Disco en la unidad del lector.
  71.            ConsigueComponentes("Win32_CDROMDrive", "MediaLoaded");
  72.  
  73.            // ¿Disco en el lector?
  74.            if (datos == "True")
  75.            {
  76.                label_Mensaje_disco.Text = "Disco en el lector: Sí.";
  77.            }
  78.  
  79.            else
  80.            {
  81.                label_Mensaje_disco.Text = "Disco en el lector: No.";      
  82.            }
  83.  
  84.            // Limpiar.
  85.            datos = "";
  86.  
  87.  
  88.        }
  89.  
  90.        private void Form1_Load(object sender, EventArgs e)
  91.        {
  92.            discoSiNo();
  93.  
  94.            // Nombre de la unidad.
  95.            ConsigueComponentes("Win32_CDROMDrive", "Id");
  96.  
  97.            // Borra espacios en blanco.
  98.            datos = datos.Trim();
  99.  
  100.            // Delimitador.
  101.            string[] unidad = datos.Split(' ');
  102.            comboBox_Unidad.Items.AddRange(unidad);
  103.  
  104.  
  105.            // Selecciona la primera unidad.
  106.            comboBox_Unidad.SelectedIndex = 0;
  107.  
  108.            // Limpiar.
  109.            datos = "";
  110.        }
  111.    }
  112. }
  113.  
En línea

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


Desconectado Desconectado

Mensajes: 874



Ver Perfil
Re: Corregir o quitar elementos del comBoBox
« Respuesta #17 en: 10 Abril 2021, 01:11 am »

Normal que en el segundo código no funcione si estás intentando comparar el contenido de <datos> a "True" (línea 74) cuando no estás guardando "True". Y tú me dirás que sí, que en la línea 71 llamas a la función y guarda "True" en <datos> pero entonces yo te diré "y qué pasa con el espacio que estás añadiendo al final?? (línea 62)"

Por otra parte decir que ese código tiene demasiado acoplamiento. Utilizas todo el tiempo la misma variable <datos> para guardar cada uno de los resultados. Es mejor que la función devuelva un string con el resultado y ya tú lo asignarás a la variable que quieras en cada momento.

Una mejor opción sería algo como esto:
Código
  1. private static readonly char SEPARADOR = "|"; // Separador de elementos. Por si en algun momento necesitas cambiarlo por otro
  2.  
  3. private string ConsigueComponentes(string hwclass, string syntax) {
  4.    string resultado = string.Empty;
  5.    ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
  6.    foreach (ManagementObject mj in mos.Get()) {
  7.        if (!string.IsNullOrEmpty(mj[syntax].ToString()))
  8.            resultado += mj[syntax].ToString() + SEPARADOR;
  9.    }
  10.    // El ultimo separador nunca lo vas a necesitar para nada -> Lo puedes eliminar directamente y quitarte futuros problemas
  11.    resultado = resultado.Remove(resultado.Length - 1);
  12.    return resultado;
  13. }
  14.  
  15. // Mejor tener un metodo que te diga si hay o no hay disco con true/false y luego ya lo usaras donde lo necesites
  16. private bool HayDisco() {
  17.    string resultado = ConsigueComponentes(...);
  18.    return (resultado == "True");
  19. }
  20.  
  21. private void Form_Load(object sender, EventArgs e) {
  22.    ...
  23.    string[] unidades = ConsigueComponentes(...).Split(SEPARADOR);
  24.    comboBox.Items.AddRange(unidades);
  25.    ...
  26. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Corregir velocidad de DVD (PAL) -4%
Multimedia
JimmyCool 0 1,210 Último mensaje 26 Abril 2008, 09:35 am
por JimmyCool
Consulta SQL;Listar elementos que estan presentes en TODOS los elementos de otra
Desarrollo Web
astinx 2 3,238 Último mensaje 2 Noviembre 2011, 23:06 pm
por astinx
Quitar elementos mysql
PHP
jalbtercero 5 994 Último mensaje 6 Marzo 2016, 17:53 pm
por #!drvy
Quitar ciertos elementos de un Array
Programación C/C++
luisito45 4 847 Último mensaje 28 Abril 2017, 10:06 am
por MAFUS
Añadir elementos al comboBox
.NET (C#, VB.NET, ASP)
Meta 2 455 Último mensaje 29 Marzo 2021, 21:25 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines