문제

나는 VBA 세계에서 왔으며 BeforeUpdate 전화를 걸 수 있습니다. 이제 나는 C#에 있고 (그리고 그것을 좋아한다) 나는 BeforeUpdate a를 요청하십시오 ComboBox Winform에?

보이지 않는 텍스트 상자를 만들고 필요한 정보를 저장할 수 있으며 업데이트 후에 필요한 상자를 살펴 보았지만 단순한 솔루션이 있기를 바랍니다.

도움이 되었습니까?

해결책

당신은 고려할 수 있습니다 SelectionChangeCommited.

MSDN에서 :

SelectionChangeCommitted는 사용자가 콤보 박스 선택을 변경할 때만 올립니다. 선택한 indexChanged 또는 SelectedValueChanged를 사용하여 사용자 변경을 캡처하지 마십시오. 선택이 프로그래밍 방식으로 변경 될 때 이러한 이벤트가 발생하기 때문입니다.

콤보 박스를 설정하여 사용자가 텍스트 상자에 입력 할 수 있도록 작동하지 않습니다. 또한 '마지막'선택된 항목이 무엇인지 알려주지 않습니다. 이 정보를 캐시해야합니다. 그러나 정보를 텍스트 상자에 저장할 필요는 없습니다. 문자열을 사용할 수 있습니다.

다른 팁

WF의 장점 중 하나는 쉽게 직접 만들 수 있다는 것입니다. 프로젝트에 새 클래스를 추가하고 아래 코드를 붙여 넣으십시오. 엮다. 새 컨트롤을 도구 상자 상단에서 양식으로 떨어 뜨립니다. 이전 이벤트를 구현하십시오.

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;
    }
  }
}

ValuememberChanged, Validating, SelectedIndexChanged 또는 TextChanged를 시도 할 수 있습니다. 그들은 이전의 업데이트처럼 발사하지 않지만 업데이트 될 내용을보고 업데이트 된 것을 처리하거나 거절 할 수 있습니다.

상자 밖에서 그런 것은 없습니다. 콤보 박스의 변화를 다루는 모든 이벤트는 새 값이 이미 선택된 후에 발생합니다. 그 시점에서 그 가치가 무엇인지 알 수있는 방법은 없습니다. 당신은 최선의 방법은 당신이 피하는 것입니다. Combobox가 채워 지 자마자 선택된 시합을 임시 변수로 저장하십시오. 그런 다음 선택된 ValueChanged 이벤트에 연결하십시오. 이 시점에서 임시 변수는 기존 값이 될 것이며 선택된 시합은 현재 값이됩니다.

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;
        }

당신이 원하는 것은 드롭 다운 이벤트라고 생각합니다. 사용자가 변경하기 전에 값이 무엇인지 알려줍니다. 그러나 사용자는 아무것도 변경하지 않을 수 있으므로 이전과 정확히 동일하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top