Tôi đang tạo một biểu mẫu đơn giản trong C# Windows Forms và chạy vào một tình huống chung mà một điều khiển có thể thay đổi trạng thái của một điều khiển khác, nhưng cả hai điều khiển đều kích hoạt một số phương thức khác.Làm cách nào để bỏ qua các sự kiện đơn giản khi kích hoạt các trạng thái điều khiển trong C# Windows Forms?
Ví dụ: xem xét Checkbox
và NumericUpDown
trong đó trạng thái hoặc giá trị của một trong hai kích thước sẽ kích hoạt thứ gì đó để vẽ lại. Các NumericUpDown
là phụ thuộc vào Checkbox
có nghĩa là nó có thể bị vô hiệu hóa hoặc bỏ qua, trừ khi Checkbox
được chọn.
Tuy nhiên, thuận tiện cho người dùng thay đổi giá trị NumericUpDown
và tự động kiểm tra Checkbox
nếu chưa được.
Vì vậy, đây là những phương pháp trong câu hỏi:
private void chkState_CheckedChanged(object sender, EventArgs e)
{
RedrawStuff();
}
private void numStateValue_ValueChanged(object sender, EventArgs e)
{
if (!chkState.Checked)
chkState.Checked = true;
RedrawStuff();
}
Vấn đề tất nhiên, đó là thay đổi giá trị NumericUpDown
gây RedrawStuff()
để bắn hai lần.
workaround của tôi là để giới thiệu một boolean nơi tôi có hiệu quả có thể phủ nhận hành vi này, nhưng đôi khi nó có thể nhận được lộn xộn:
bool _preventStateChange;
private void chkState_CheckedChanged(object sender, EventArgs e)
{
if (_preventStateChange)
return;
RedrawStuff();
}
private void numStateValue_ValueChanged(object sender, EventArgs e)
{
_preventStateChange = true;
if (!chkState.Checked)
chkState.Checked = true;
RedrawStuff();
_preventStateChange = false;
}
Đây có phải là cách tốt nhất để xử lý tình huống này?
Tôi đã đơn giản hóa mã ví dụ; có lẽ 'RedrawStuff' là một sự lựa chọn kém. Trong trường hợp này nó liên quan đến việc truy vấn lại một cơ sở dữ liệu, thay đổi một vài databindings, và thay đổi một số trạng thái điều khiển và bảng điều khiển như các nhóm ẩn, vv – JYelton
Tôi đã sử dụng cờ như vậy hàng chục lần, và đã không tìm thấy một thay thế tôi xem xét tốt hơn cho trường hợp chung. – xpda
Hủy đăng ký khỏi các sự kiện bạn không muốn kích hoạt (trong trường hợp này là chkState_CheckedChanged) trong khoảng thời gian bạn không muốn chúng kích hoạt. – Tom