2010-09-17 18 views
6

Tôi mới dùng C# và Windows Form nhưng nếu tôi có một radio và tôi gọi radiobutton1.Checked = true, có cách nào để nó không kích hoạt sự kiện CheckedChange không? Tôi muốn phân biệt giữa người dùng nhấp vào radio và tôi thiết lập nút radio theo chương trình. Điều này có thể không?Khi bạn đặt thuộc tính Đã kiểm tra trong RadioBox, bạn có thể chặn sự kiện CheckChanged không?

+2

Điều này nghe có vẻ giống như một vấn đề thiết kế đối với tôi. Bạn đang cố định nghĩa hành vi nào? – womp

+0

Có thể bạn có thể thiết kế xung quanh nó nhưng tôi được sử dụng để điều khiển không gửi sự kiện nếu SetValue được gọi. wxWidgets hoạt động như thế này và làm cho cuộc sống dễ dàng hơn.Ok, có vẻ như câu trả lời là không; sự kiện được kích hoạt và không thể bị chặn lại. Cảm ơn. – genomess

Trả lời

1

Tại sao mã của bạn nên quan tâm đến người đã kiểm tra radio?

CHỈNH SỬA: Có nhiều cách xung quanh (lớp con, cờ), nhưng không. Lý do "hợp pháp" duy nhất tôi có thể nghĩ đến vì muốn điều này là để ngăn chặn một số tác dụng phụ xảy ra khi giá trị ban đầu (được lập trình) hiển thị, và thậm chí đó là nghi ngờ. Suy nghĩ lại tác dụng phụ, liệu nó có thực sự thuộc về sự kiện thay đổi, hay cam kết?

Thông tin thêm một lý do/điều gì sẽ hữu ích. Trên bề mặt, điều này trông giống như một lỗi thiết kế.

+0

Tôi nghĩ anh ấy muốn làm những việc khác nhau tùy thuộc vào người dùng nhấp và thay đổi mã sau thay đổi. –

+0

Bạn đã đúng. – genomess

+0

tôi hiểu đó là những gì OP muốn; Tôi không hiểu tại sao, và nghi ngờ một lỗi thiết kế trong sự cần thiết –

0

Một (hackish) cách để làm điều đó sẽ là phân lớp RadioButton và ghi đè phương thức ảo OnCheckChanged, ngăn chặn sự kiện nếu thuộc tính Checked được đặt theo chương trình.

Tuy nhiên, vì nút radio thuộc về một nhóm, sự kiện luôn kích hoạt theo cặp (oen để bỏ chọn, một cho kiểm tra). Do đó, bạn sẽ muốn chặn sự kiện cho toàn bộ nhóm toàn bộ nhóm khi bạn chọn nút được chọn theo chương trình. Dưới đây là ví dụ về triển khai:

public class CustomRadioButton : RadioButton 
{ 
    private bool _suppressCheckedEvent; 

    public void SetChecked(bool value, bool suppressCheckedEvent) 
    { 
     if (!suppressCheckedEvent) 
      Checked = value; 
     else 
     { 
      SetSupressModeForGroup(true); 
      Checked = value; 
      SetSupressModeForGroup(false); 
     } 
    } 

    private void SetSupressModeForGroup(bool suppressCheckedEvent) 
    { 
     foreach (var crb in Parent.Controls.OfType<CustomRadioButton>()) 
      crb._suppressCheckedEvent = suppressCheckedEvent; 
    } 

    protected override void OnCheckedChanged(EventArgs e) 
    { 
     if (!_suppressCheckedEvent) 
      base.OnCheckedChanged(e); 
    } 
} 

Trong quá trình triển khai này, việc thay đổi trạng thái đã kiểm tra thông qua thuộc tính Checked sẽ luôn kích hoạt sự kiện. Khi bạn gọi phương thức SetChecked, bạn có thể chọn để chặn sự kiện.

2

Đây là phương pháp đơn giản khi sử dụng sự kiện khi bạn cảm thấy thích.

private bool SuppressRadioButton1Event { get; set; } 

private void radioButton1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (!this.SuppressRadioButton1Event) 
    { 
     MessageBox.Show("Not suppressed!"); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SetRadioButton1(false); 
} 

private void SetRadioButton1(bool checkedOn) 
{ 
    this.SuppressRadioButton1Event = true; 
    radioButton1.Checked = checkedOn; 
    this.SuppressRadioButton1Event = false; 
} 
+0

+1 Tôi phải thừa nhận cách này của 'flagging' là tốt hơn so với tôi :) –

2

Một cách rất dễ dàng:

public void radio_OnCheckChanged(object sender, EventArgs e) 
{ 
    RadioButton r = sender as RadioButton; 
    bool isUserChange = r.Tag.Equals(1); 
    if (isUserChange) blabla 
    else blabla 
    r.Tag = null;  
} 

public void MyMethod() 
{ 
    radio1.Tag = 1; 
    radio.Checked = true; 
} 

Bạn có thể sử dụng bất kỳ loại flag mà người dùng không thể thực hiện bằng cách clicking.But của họ, bạn có thể thực hiện thông qua mã của bạn.

+0

Đặt thẻ cho cờ khác thay vì null sẽ tránh ngoại lệ sử dụng null. – amalgamate

6

Dừng cố gắng đánh bại thiết kế của sự kiện CheckedChanged. Nó đặc biệt phải bao gồm các thay đổi có lập trình.

Nếu bạn muốn thay đổi do người dùng kích hoạt chứ không phải thay đổi có lập trình, hãy sử dụng sự kiện Click thay thế. (Bạn có thể nghĩ rằng bạn không muốn giới hạn bản thân đối với các nhấp chuột, đừng lo lắng, có sự kiện MouseClick cho điều đó, Click cũng bao gồm các thay đổi về bàn phím.)

+0

Điều này không kích hoạt cho một 'RadioButton' khi nó đi từ một kiểm tra đến một trạng thái không được kiểm soát. – Ani

+0

@Ani: genomess cho biết anh ấy muốn một sự kiện chỉ kích hoạt khi người dùng nhấp vào nút. Tôi khá chắc chắn rằng không có nút radio nào bị người dùng bỏ chọn khi nhấp vào nó. –

+0

Đúng, đủ công bằng. – Ani

-1

Bạn có thể cố gắng đính kèm sự kiện theo chương trình . Dựa trên cấu hình ứng dụng của tôi, tôi kiểm tra một số nút radio nhưng tôi không muốn kích hoạt sự kiện. Để đính kèm sự kiện theo chương trình:

chbOptionX.CheckedChanged + = new System.EventHandler (this.chbShowStockBySizeAndColor_CheckedChanged);

+0

Nhưng bạn vẫn có thể _không phân biệt_ giữa các thay đổi thiết lập và nhấp chuột khi sự kiện xảy ra. – DerMike

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