¿Cómo se puede actualizar un cuadro combinado elemento en su lugar?

El ComboBox de los Elementos de la colección es un ObjectCollection, así que, por supuesto, usted puede almacenar cualquier cosa que usted desea, pero que significa que no se obtiene una propiedad de Texto como lo haría con, digamos, un ListViewItem. La lista desplegable muestra los elementos llamando al método ToString() de cada objeto, o el uso de la reflexión, si la propiedad DisplayMember se establece.

Mi ComboBox es en DropDownList modo. Tengo una situación en la que quiero actualizar el texto de la posición de un elemento en la lista cuando llegue seleccionado por el usuario. El problema es que el ComboBox no volver a la consulta para que el texto en cualquier momento, excepto cuando se carga, y yo no puedo entender cómo los demás a hacer lo que quiero, además de quitar y volver a agregar el elemento seleccionado, así:


PlantComboBoxItem selectedItem = cboPlants.SelectedItem as PlantComboBoxItem;

//...

cboPlants.BeginUpdate();

int selectedIndex = cboPlants.SelectedIndex;
cboPlants.Items.RemoveAt(selectedIndex);
cboPlants.Items.Insert(selectedIndex, selectedItem);
cboPlants.SelectedIndex = selectedIndex;

cboPlants.EndUpdate();

Este código funciona bien, excepto por el hecho de que mi SelectedIndex evento termina siendo despedido dos veces (una vez en el original de eventos de usuario, y luego otra vez cuando me re-establecer la propiedad en el código). En este caso, no es una gran cosa que el evento es disparado dos veces, pero es ineficiente, y odio eso. Yo podía armar una bandera de forma que se salga el evento de la segunda vez, pero esa es la piratería.

Existe una mejor manera de conseguir que esto funcione?

OriginalEl autor Jon Seigel | 2009-09-17

3 respuestas

  1. 8

    Un sucio hack:

    typeof(ComboBox).InvokeMember("RefreshItems", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, cboPlants, new object[] { });

    OriginalEl autor TOS

  2. 4

    Hmm… se puede utilizar una BindingList<T>, como se describe aquí? De esa manera, usted puede modificar el elemento de la colección y se han reflejado en la ComboBox sin tener que añadir ni quitar nada de la de control.

    Tendría que tener una colección de algo como esto, que contiene todos los elementos para la ComboBox:

    private BindingList<PlantComboBoxItem> plantComboBoxItems;

    Entonces, en algún momento (como cuando el programa se inicia), que se unen a la ComboBox:

    cboPlants.DataSource = plantComboBoxItems;

    Ahora, usted puede modificar la colección directamente:

    plantComboBoxItems[cboPlants.SelectedIndex].doWhateverYouWant();

    Y los cambios se reflejarán en cboPlants. Es esto lo que estás buscando?

    OriginalEl autor Donut

  3. 2

    Tengo, el uso de la Rosquilla de la sugerencia.

    En forma de clase:

    private BindingList<PlantComboBoxItem> _plantList;

    En el método de carga:

    _plantList = new BindingList<PlantComboBoxItem>(plantItems);
    cboPlants.DataSource = _plantList;

    En el evento SelectedIndexChanged:

    int selectedIndex = cboPlants.SelectedIndex;
    _plantList.ResetItem(selectedIndex);

    Gracias!

    Como un aparte, me pregunto por qué nadie ha pensado en incluir algo como un RefreshItem función en el ComboBox.
    Noooooo… ResetItem() activa el SelectedIndexChanged método 🙁 bueno, esto es aún más limpio que mi solución original.
    ¿Necesita llamar ResetItem()? El elemento en cboPlants debe ser cambiado si usted acaba de actualizar directamente (creo?). Usted puede acceder a ella en el SelectedIndexChanged evento con _plantList[selectedIndex].
    Sí, me tiene que llamar ResetItem(). El control no tiene idea de actualizar el elemento de otra manera (he intentado sacar esa línea y no actualizar el elemento cuando me lo cambiaron). El elemento no se actualiza automáticamente, incluso aunque los datos subyacentes en la PlantComboBoxItem cambiado. Creo que el ResetItem() la función debe ser implementada internamente como lo estaba haciendo antes, quitar manualmente y, a continuación, agregar el elemento de nuevo. Un pan de PITA.

    OriginalEl autor Jon Seigel

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *