Есть ли BeforeUpdate для C # ComboBox на Winform - PullRequest
3 голосов
/ 08 января 2009

Я родом из мира VBA, и помню, что в поле со списком я мог сделать BeforeUpdate звонок. Теперь я нахожусь в C # (и мне это нравится), и мне было интересно, есть ли BeforeUpdate вызов для ComboBox в Winform?

Я могу создать невидимое текстовое поле и хранить там нужную мне информацию, и после обновления посмотрите на это окно, чтобы найти то, что мне нужно, но я надеялся, что было более простое решение.

Ответы [ 5 ]

10 голосов
/ 08 января 2009

Одним из плюсов WF является то, что вы можете легко сделать свой собственный. Добавьте новый класс в свой проект и вставьте код ниже. Компиляция. Перетащите новый элемент управления из верхней части панели инструментов на форму. Реализуйте событие 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;
    }
  }
}
5 голосов
/ 08 января 2009

Вы можете рассмотреть SelectionChangeCommited.

Из MSDN:

SelectionChangeCommitted повышен только когда пользователь меняет комбо выбор коробки. Не использовать SelectedIndexChanged или SelectedValueChanged для захвата пользователя изменения, потому что эти события также повышается при изменении выбора программным способом.

Это не будет работать, если вы установили свой комбинированный список, чтобы позволить пользователю печатать в текстовом поле. Кроме того, он не скажет вам, каким был «последний» выбранный элемент. Вам придется кэшировать эту информацию. Тем не менее, вам не нужно хранить вашу информацию в текстовом поле. Вы можете использовать строку.

1 голос
/ 08 января 2009

Из коробки ничего подобного нет. Все события, связанные с изменением в поле со списком, происходят после того, как новое значение уже выбрано. В этот момент невозможно определить, какое значение ИСПОЛЬЗУЕТСЯ. Тебе лучше всего делать то, к чему ты стремился. Как только ваш ComboBox заполнится, сохраните SelectedItem во временную переменную. Затем подключитесь к событию SelectedValueChanged. В этот момент ваша временная переменная будет вашим старым значением, а SelectedItem будет вашим текущим значением.

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;
        }
1 голос
/ 08 января 2009

Вы можете попробовать ValueMemberChanged, Validating, SelectedIndexChanged или TextChanged. Они не запускаются, как BeforeUpdate, но вы можете посмотреть, что будет обновлено и обработать обновленное, или отказаться от него.

0 голосов
/ 16 ноября 2011

Я думаю, что вам нужно было событие DropDown. Он скажет вам, что это значение, прежде чем пользователь изменит его. Тем не менее, пользователь может ничего не менять, так что это не то же самое, что BeforeUpdate.

...