valor - ¿Hay un BeforeUpdate para un C#ComboBox en una forma de cambio?
obtener el valuemember de un combobox c# (5)
Vengo del mundo de VBA, y recuerdo que había una llamada BeforeUpdate
que podía hacer en un cuadro combinado. Ahora estoy en C # (y me encanta) y me preguntaba si existe una llamada BeforeUpdate
para un ComboBox
en un formulario de Winform.
Puedo crear un cuadro de texto invisible y almacenar la información que necesito allí y después de la actualización, mire ese cuadro para ver lo que necesito, pero esperaba que hubiera una solución más simple.
Fuera de la caja, no hay nada como eso. Todos los eventos que se ocupan del cambio en el cuadro combinado suceden después de que el nuevo valor ya está seleccionado. En ese momento, no hay forma de saber cuál es el valor que se debe usar. Lo mejor es que te eludiste. Tan pronto como se complete su ComboBox, guarde el SelectedItem en una variable temporal. A continuación, enganche en el evento SelectedValueChanged. En ese punto, su variable temporal será su valor anterior, y SelectedItem será su valor actual.
private object oldItem = new object();
private void button3_Click(object sender, EventArgs e)
{
DateTime date = DateTime.Now;
for (int i = 1; i <= 10; i++)
{
this.comboBox1.Items.Add(date.AddDays(i));
}
oldItem = this.comboBox1.SelectedItem;
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
//do what you need with the oldItem variable
if (oldItem != null)
{
MessageBox.Show(oldItem.ToString());
}
this.oldItem = this.comboBox1.SelectedItem;
}
Puede considerar SelectionChangeCommited
.
Desde MSDN:
SelectionChangeCommitted se genera solo cuando el usuario cambia la selección del cuadro combinado. No utilice SelectedIndexChanged o SelectedValueChanged para capturar cambios de usuario, porque esos eventos también se generan cuando la selección cambia de forma programática.
Esto no funcionará cuando haya configurado su cuadro combinado para permitirle al usuario escribir en el cuadro de texto. Además, no le dirá cuál fue el "último" elemento seleccionado. Tendrá que guardar en caché esta información. Sin embargo, no necesita almacenar su información en un cuadro de texto. Puedes usar una cadena.
Puede probar ValueMemberChanged, Validating, SelectedIndexChanged o TextChanged. No se activan como BeforeUpdate, pero puede ver lo que se actualizará y manejar, o rechazarlo.
Una de las cosas buenas de WF es que puedes hacer fácilmente las tuyas propias. Agregue una nueva clase a su proyecto y pegue el siguiente código. Compilar. Coloque el nuevo control desde la parte superior de la caja de herramientas en su formulario. Implementar el evento BeforeUpdate.
using System;
using System.ComponentModel;
using System.Windows.Forms;
public class MyComboBox : ComboBox {
public event CancelEventHandler BeforeUpdate;
public MyComboBox() {
this.DropDownStyle = ComboBoxStyle.DropDownList;
}
private bool mBusy;
private int mPrevIndex = -1;
protected virtual void OnBeforeUpdate(CancelEventArgs cea) {
if (BeforeUpdate != null) BeforeUpdate(this, cea);
}
protected override void OnSelectedIndexChanged(EventArgs e) {
if (mBusy) return;
mBusy = true;
try {
CancelEventArgs cea = new CancelEventArgs();
OnBeforeUpdate(cea);
if (cea.Cancel) {
// Restore previous index
this.SelectedIndex = mPrevIndex;
return;
}
mPrevIndex = this.SelectedIndex;
base.OnSelectedIndexChanged(e);
}
finally {
mBusy = false;
}
}
}
Creo que lo que querías era el evento DropDown. Le dirá cuál es el valor antes de que el usuario lo cambie. Sin embargo, el usuario puede terminar sin cambiar nada, por lo que no es exactamente lo mismo que BeforeUpdate.