winform에 c# combobox에 대한 이전의 업데이트가 있습니까?
-
06-07-2019 - |
문제
나는 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;
}
당신이 원하는 것은 드롭 다운 이벤트라고 생각합니다. 사용자가 변경하기 전에 값이 무엇인지 알려줍니다. 그러나 사용자는 아무것도 변경하지 않을 수 있으므로 이전과 정확히 동일하지 않습니다.