2010-02-16 8 views
5

Ok, así que estoy tratando de mover elementos de un cuadro de lista a otro utilizando los botones múltiples, es decir,botones de desactivación de un problema en C#

tengo 2 botones cmdRight y cmdRight2 que son tanto personas con discapacidad en la carga de forma

Si el usuario selecciona un solo elemento en el primer cuadro de lista. Se habilita un botón cmdRIght pero el comando cmdRight2 sigue desactivado. Si el usuario selecciona varios elementos en el primer cuadro de lista, se habilita el botón cmdRight2 pero el comando cmdRight está desactivado.

Tengo los botones de mover para trabajar pero el problema que tengo es después de mover varios elementos con el botón cmdRight2 el botón cmdRight habilita (que no debería solo habilitar después de seleccionar un solo elemento en el cuadro de lista). He intentado numerosas sentencias if, etc., y aún así sucede.

Soy nuevo en C# por lo que cualquier ayuda sería apreciada.

Gracias

 private void lbList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (this.lbList1.SelectedItems != null) 
      { 
       cmdRight.Enabled = true; //enable cmdRight 
       cmdClear.Enabled = true; //enable cmdClear 
       if (this.lbList1.SelectedItems.Count > 1)//if multiple items selected 
       { 
        cmdRight.Enabled = false; 
        cmdRight2.Enabled = true; //enable cmdRight2    
       } 
      } 
     } 


    private void cmdRight2_Click(object sender, EventArgs e) 
    { 
     foreach (int i in lbList1.SelectedIndices) 
     { 
      lbList2.Items.Add(lbList1.Items[i].ToString()); 
     } 
     while (lbList1.SelectedItems.Count > 0) 
     { 
      lbList1.Items.Remove(lbList1.SelectedItems[0]); 
     } 
     cmdRight2.Enabled = false; 

    } 

    private void cmdRight_Click(object sender, EventArgs e) 
    { 
     lbList2.Items.Add(lbList1.SelectedItem); //Add selected item from list1 to list2 
     lbList1.Items.Remove(lbList1.SelectedItem);//remove the selected item in list1 

     cmdRight.Enabled = false; //disable cmdRight 
    } 
+0

has puesto los puntos de interrupción en el inicio de cada función para ver el orden en que se los llama? O al menos, un punto de interrupción cada vez que cmdRight.Enabled se establece en verdadero. – taylonr

+1

Esta no es una respuesta a su pregunta, pero ¿por qué no combinar los dos botones (simplemente eliminando cmdRight y manteniendo cmdRight2)? Obviamente no conozco su diseño, pero probablemente resolvería su problema. –

+0

Probé los puntos de interrupción y por alguna razón la declaración if "if (this.lbList1.SelectedItems! = Null)" parece ser siempre cierta. Incluso cuando no se selecciona nada –

Respuesta

1

Creo que quieres

if (this.lbList1.SelectedItems.Count == 1) 
{ 
} 
else if(this.lbList1.SelectedItems.Count > 1) 
{ 
} 
else 
{ 
} 

en lugar de

if (this.lbList1.SelectedItems != null) 

Posteriormente, se podría colocar todo esto en un método llamado "EnableButtons" como se ha mencionado en otras partes

+0

¡Yey! ¡Eso funcionó muchísimas gracias! Investigaré para hacer métodos a continuación. ¡Muchas gracias! hazlo desde la noche anterior. –

+0

Cuando estás trabajando en problemas y ves que algo como SelectedItems nunca es nulo, deberás buscar otro modificador (como en este caso, el número de elementos elegido) – taylonr

3

¿Qué hay de la creación de un método EnableButtons que activa/desactiva a los botones de acuerdo a criterios dados como "Activar cmdRight2 sólo si es verdad ....".

Luego, llame al método siempre que algunos de los criterios cambien. La ventaja de esto en la forma en que lo hace ahora es que los criterios dentro del método son "absolutos" (en el sentido de que los botones están habilitados o deshabilitados de una vez) en lugar de "relativo" (habilite el botón cuando el usuario hace esto o aquello).

También puede llamar a este método desde el evento Application.Idle en lugar de llamarlo en respuesta a alguna acción del usuario.

EDITAR

declaramos lo siguiente método:

private void EnableButtons() 
{ 
    controlX.Enabled = (<condition...>); 
    controlY.Enabled = (<condition...>); 
} 

Puede invocar ese método de las posiciones de código en el que algo debe cambiar en los botones estados habilitados, o se puede hacer lo siguiendo en el constructor de la forma:

public Form1() 
{ 
    // Other code... 

    Application.Idle += new <The respective event handler>; 
} 

Luego, declare un método con la respectiva firma para el evento y llame al EnableButtons allí. Se llamaría a este método en situaciones donde su aplicación está "inactiva" (esperando acciones del usuario).

+0

Soy bastante nuevo en la programación, así que estoy no estoy seguro de cómo hacer eso ...: -S –

+0

Buena sugerencia. Todavía necesitará arreglar la lógica de habilitar/deshabilitar. – taylonr

+0

@KP: Edité mi respuesta con algún pseudo-código. Encontrarás fácilmente lo que quiero decir - simplemente no tengo la sintaxis correcta en mente en este momento. –

0

El problema es que está eliminando los elementos uno por uno, por lo que cuando solo queda un elemento, básicamente tiene un elemento seleccionado para que su programa habilite el cmdRight. La forma más fácil de solucionar esto es tener

cmdRight2.Enabled = false; 
cmdRight.Enabled = false; 

al final del método cmdRight2_Click.

Cuestiones relacionadas