Tôi đã giải quyết vấn đề này trước đây. Hãy kiểm soát NumericUpDown như một ví dụ minh họa.
Đầu tiên, tạo một điều khiển mới (gọi là MyNumericUpDown) được kế thừa từ NumericUpDown. Tạo ghi đè cho các phương thức UpButton, DownButton và OnLostFocus. Cũng tạo một phương thức công khai để thiết lập giá trị của điều khiển theo lập trình. Tạo một loại enum gọi là 'ValueChangedType' có 4 giá trị khác nhau được gọi là TextEdit, UpButton, DownButton, và Programmatic (hoặc gọi chúng là bất cứ điều gì bạn thích). Cũng tạo một thuộc tính được gọi là ChangedType kiểu ValueChangedType. Đây là những gì lớp học trông như thế nào.
public partial class MyNumericUpDown : NumericUpDown
{
public enum ValueChangedType
{
TextEdit,
UpButton,
DownButton,
Programmatic
}
public ValueChangedType ChangedType = ValueChangedType.Programmatic;
public MyNumericUpDown()
{
InitializeComponent();
}
public override void UpButton()
{
this.ChangedType = ValueChangedType.UpButton;
base.UpButton();
}
public override void DownButton()
{
this.ChangedType = ValueChangedType.DownButton;
base.DownButton();
}
protected override void OnLostFocus(EventArgs e)
{
this.ChangedType = ValueChangedType.TextEdit;
base.OnLostFocus(e);
}
public void SetValue(decimal val)
{
this.ChangedType = ValueChangedType.Programmatic;
this.Value = val;
}
}
Bây giờ, trong biểu mẫu của bạn, hãy tạo điều khiển MyNumericUpDown (gọi nó là 'myNUD'). Trong xử lý sự kiện ValueChanged cho sự kiểm soát, bạn có thể nhận được giá trị của tài sản ChangedType, và làm điều gì đó với nó:
private void myNUD_ValueChanged(object sender, EventArgs e)
{
MyNumericUpDown nud = sender as MyNumericUpDown;
var myChangedType = nud.ChangedType;
/* do something */
}
+1 cho 'thực hành tốt nhất' ý tưởng. Tôi đang gặp vấn đề tương tự - thiết lập một hiệu ứng trường cho tất cả những người khác. Tôi đã thêm rất nhiều lần thoát hiểm sớm để các sự kiện chỉ kích hoạt nếu dữ liệu cơ bản khác và logic tự giải mã. – ojrac