2008-11-20 17 views
5

Escribo esta pregunta con el ánimo de responder sus propias preguntas, ya que encontré una solución al problema, pero si alguien tiene una solución mejor, con gusto la escucharé.¿Por qué SelectedIndices y SelectedItems no funcionan cuando ListView se instancia en la prueba unitaria?

En la aplicación en la que estoy trabajando actualmente estoy subclasificando el control ListView para agregar algunas funcionalidades de las cuales algunas interactúan con las propiedades ListView SelectedIndices y SelectedItems.

El problema es que cuando intento probar mi subclase, las propiedades SelectedIndices y SelectedItems no se actualizan cuando agrego elementos a la selección. He intentado tanto

item.Selected = true 

y

listView.SelectedIndices.Add(...) 

Pero simplemente no parecen ser afectados selectedIndices o SelectedItems. Las pruebas de la unidad para las otras partes de la funcionalidad funcionan bien.

¿Cómo puedo probar la unidad de las partes dependientes de la selección de mi subclase ListView?

Respuesta

7

El problema parece ser que los selectedIndices y SelectedItems no se actualiza correctamente si el ListView no se ha establecido, como se dice en el siguiente comentario de la documentación de MSDN de la ListViewItem.Selected property:

La propiedad seleccionada no se puede Sea confiable si su ListView nunca se ha dibujado (por ejemplo, está en un TabControl, en una pestaña que aún no se ha seleccionado). En ese caso, los SelectedItems y SelectedIndices del ListView principal no se actualizan correctamente y aún estarán vacíos.

Una solución a este problema es crear una clase de formulario ficticio simple en la prueba, agregar ListView al formulario y simplemente mostrar el formulario. Después de eso, las propiedades SelectedIndices y SelectedItems funcionan como se esperaba.

Algo como esto:

[Test] 
    public void CanGetSelectedItems() 
    { 
     // simple test to make sure that the SelectedIndices 
     // property is updated 
     using (var f = new DummyForm(listView)) 
     { 
      f.Show(); 

      listView.SelectedIndices.Add(0); 
      Assert.AreEqual(1, listView.SelectedIndices.Count); 
     } 
    } 

    private class DummyForm : Form 
    { 
     public DummyForm(ListView listView) 
     { 
      // Minimize and make it not appear in taskbar to 
      // avoid flicker etc when running the tests 
      this.WindowState = FormWindowState.Minimized; 
      this.ShowInTaskbar = false; 
      this.Controls.Add(listView); 
     } 
    } 
8

me encontré con un truco que puede utilizar para conseguir esas propiedades pobladas:

listView.AccessibilityObject.ToString(); // solución alternativa para obtener las propiedades de los elementos seleccionados actualizadas

2

Descubrí que al llamar a .CreateControl() en el objeto ListView actualizaba las propiedades de SelectedItems.

0

"Encontré que llamar a .CreateControl() en el objeto ListView actualizó las propiedades de SelectedItems".

Es cierto, pero solo si usa Multi-select también.

Cuestiones relacionadas