2009-03-16 24 views
7

Trong C#, sự kiện đã thay đổi cho điều khiển (ví dụ: số đếm ngược) được kích hoạt. sự kiện khác.Xác định nếu sự kiện đã thay đổi xảy ra từ đầu vào của người dùng hoặc không

Có cách nào để xác định xem sự kiện có xảy ra do kết quả do người dùng nhập không? Ví dụ: cả việc thay đổi giá trị của chữ số theo cách thủ công và nhấp vào nút1 sẽ hiển thị "giá trị đã thay đổi". Điều gì sẽ xảy ra nếu tôi chỉ muốn hiển thị "giá trị thay đổi" nếu nó được thay đổi thông qua người dùng nhấp vào mũi tên lên/xuống trong điều khiển chứ không phải là kết quả của việc nhấp vào button1?

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
    { 
     MessageBox.Show("value changed"); 
    } 

    private void button1_Click_1(object sender, EventArgs e) 
    { 
     numericUpDown1.Value = 3; 
    } 

Trả lời

5

Không có cách nào tốt đẹp để làm điều đó. Bạn có thể tìm giải pháp cho các trường hợp cụ thể, ví dụ:

  • nghe MouseDown hoặc gì đó thay vì giá trịThay đổi trên menu thả xuống số.
  • Đặt cờ trong trình xử lý sự kiện nhấn nút sẽ cấm hộp tin nhắn hiển thị.

    Nói chung, bạn nên cố gắng tổ chức biểu mẫu của mình theo cách mà giá trị đã thay đổi.

+0

+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

1

Không, không có cách tích hợp để thực hiện những gì bạn đang cố gắng làm khi mã kích hoạt sự kiện đang kích hoạt khi giá trị thay đổi.

5

Bạn có thể kiểm tra xem liệu sốUpDown có phải là ActiveControl hay không. Khi bạn đặt giá trị của sốUpDown trong khi nhấp vào nút, button1 phải là ActiveControl. Khi người dùng thay đổi giá trị thông qua sốUpDown, thì sốUpUpown phải là ActiveControl.

if(numericUpDown1 == this.ActiveControl) 
{ 
    MessageBox.Show("value changed"); 
} 
0
  1. Kế thừa NumericUpDown Lớp
  2. Tạo một lá cờ cho xác định giá trị thay đổi theo chương trình, hoặc thay đổi bởi GUI
  3. quá tải Property Value để thiết lập trên lá cờ

Đây là giải pháp của tôi trong VB .NET

Private m_blnIsValueChangedByGui As Boolean = True 

    Public Property IsValueChangedByGui() As Boolean 
     Get 
      Return m_blnIsValueChangedByGui 
     End Get 
     Set(ByVal value As Boolean) 
      m_blnIsValueChangedByGui = value 
     End Set 
    End Property 

    Public Shadows Property Value() As Decimal 
     Get 
      Return MyBase.Value 
     End Get 
     Set(ByVal value As Decimal) 
      IsValueChangedByGui = False 

      If (value > Me.Maximum) Then 
       MyBase.Value = Me.Maximum 
      ElseIf (value < Me.Minimum) Then 
       MyBase.Value = Me.Minimum 
      Else 
       MyBase.Value = value 
      End If 

      IsValueChangedByGui = True 
     End Set 
    End Property 
0

Một trường hợp thú vị là điều khiển ComboBox, mà không phân biệt giữa các thay đổi trong lựa chọn bởi sự kiện SelectionChangeCommitted, được nâng lên chỉ khi người dùng thực hiện thay đổi thông qua GUI và sự kiện SelectedIndexChanged, được nâng lên mỗi lần thay đổi thuộc tính SelectedIndex . Bạn có thể kiểm tra nguồn cho ComboBox và xem nó được thực hiện như thế nào. Tất nhiên, không có gì đảm bảo rằng nguyên tắc sẽ được chuyển giao cho các điều khiển khác.

0

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 */ 
    } 
Các vấn đề liên quan