2010-02-09 56 views
6

Tôi đang gặp sự cố vòng lặp vô hạn.C# set UserControl.Value mà không cần gọi sự kiện ValueChanged

Tôi có hai điều khiển lên/xuống số (tham số nhập Chiều cao và Chiều rộng). Khi người dùng thay đổi giá trị của một trong các điều khiển, tôi cần phải quy mô khác để giữ một hằng số tỷ lệ chiều cao đến chiều rộng.

Có cách nào để đặt giá trị của điều khiển mà không cần gọi sự kiện ValueChanged hay không. Tôi chỉ muốn sự kiện ValueChanged thực hiện khi người dùng thay đổi giá trị.

private void FloorLength_ValueChanged(object sender, EventArgs e) 
{ 
    if (this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap != null) 
    { 
     FloorWidth.Value = FloorLength.Value * 
      ((decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Height/
      (decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Width); 
    } 
} 

private void FloorWidth_ValueChanged(object sender, EventArgs e) 
{ 
    if (this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap != null) 
    { 
     FloorLength.Value = FloorWidth.Value * 
      ((decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Width/
      (decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Height); 
    } 
} 

Trả lời

5

Cảm ơn câu trả lời của bạn.

Tôi đã đưa ra giải pháp thay thế hoạt động. Người dùng thay đổi giá trị từ giao diện người dùng kích hoạt sự kiện, trong khi các thay đổi tham số giá trị có lập trình không kích hoạt sự kiện.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 

namespace myNameSpace.Forms.UserControls 
{ 
    public class NumericUpDownSafe : NumericUpDown 
    { 
     private bool bypassEvent = false; 
     EventHandler eventHandler = null; 

     public event EventHandler ValueChanged 
     { 
      add 
      { 
       eventHandler += value; 
       base.ValueChanged += value; 
      } 

      remove 
      { 
       eventHandler -= value; 
       base.ValueChanged -= value; 
      } 
     } 

     public decimal Value 
     { 
      get 
      { 
       return base.Value; 
      } 
      set 
      { 
       base.ValueChanged -= eventHandler; 
       base.Value = value; 
       base.ValueChanged += eventHandler; 
      } 
     } 
    } 
} 
+0

tôi thích giải pháp này – David

4

Tôi không quen với điều khiển NumericUpDown, nhưng có thể không có cách nào để đặt giá trị mà không kích hoạt sự kiện ValueChanged. Thay vào đó, trước khi bạn đặt giá trị, bạn có thể đặt cờ cho biết rằng sự kiện sẽ bị bỏ qua và xóa cờ sau khi đặt giá trị. Trong trình xử lý sự kiện của bạn, không phải làm gì nếu cờ được đặt.

private bool ignoreEvent = false; 
private void setValue(int value) 
{ 
    ignoreEvent = true; 
    FloorLength.Value = value; 
    ignoreEvent = false; 
} 

private void FloorLength_ValueChanged(object sender, EventArgs e) 
{ 
    if(ignoreEvent) { return; } 

    // your code here 
} 
1

Về lý thuyết, các giá trị này sẽ ổn định ... Ý nghĩa nếu người dùng thay đổi 1, hệ thống sẽ thay đổi cài đặt khác và sau đó hệ thống đầu tiên vẫn giữ nguyên. Do đó, tôi chỉ cần thêm séc vào cả hai trình xử lý sự kiện (mã giả):

newValue = equation; 
if(controlValue != newValue) 
{ 
    controlValue = newValue; //raises the event only when necessary. 
} 
+0

họ không ổn định, tôi nghĩ rằng đó là bởi vì các giá trị được làm tròn đến hai chữ số thập phân – Kevin

+0

Vì vậy, chúng ta có thể nhận được một số thông tin thêm về các giá trị (một ví dụ hoặc hai) và các thuộc tính NumericUpDown (ví dụ DecimalPlaces) ? –

Các vấn đề liên quan