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?
Trả lời
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ế.
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. –
Bạn đã đúng. – genomess
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 –
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.
Đâ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;
}
+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 :) –
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.
Đặt thẻ cho cờ khác thay vì null sẽ tránh ngoại lệ sử dụng null. – amalgamate
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.)
Đ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
@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ó. –
Đúng, đủ công bằng. – Ani
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);
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
- 1. Sự cố trong sự kiện Đã kiểm tra sự kiện
- 2. Bạn có thể đặt hai điều kiện vào thuộc tính thử nghiệm xslt không?
- 3. Bạn có nên kiểm tra biến trước khi đặt giá trị của nó trong C++ không?
- 4. Bạn có thể buộc một sự kiện chạm để hủy sau khi chạm vàoBan không?
- 5. Bootstrap chuyển sự kiện đã kiểm tra?
- 6. Tại sao C# yêu cầu bạn viết một kiểm tra rỗng mỗi khi bạn kích hoạt một sự kiện?
- 7. Bạn có thể đặt thuộc tính [[Class]] bên trong của đối tượng ECMAScript không?
- 8. Bạn có thể đặt thuộc tính trên Backbone.js Collections không? Nếu vậy, làm thế nào?
- 9. jQuery/Javascript: Nhấp vào sự kiện trên một hộp kiểm và 'kiểm tra' thuộc tính
- 10. Sự cố khi chạy epstopdf. Kiểm tra cài đặt TeX của bạn
- 11. Có sự kiện nào xảy ra khi một ràng buộc đã được đặt trên một thuộc tính không?
- 12. Kiểm tra xem thuộc tính CoreData có trống không
- 13. thuộc tính sự kiện touchend
- 14. Làm thế nào để bạn kiểm tra các sự kiện bàn phím với kivy?
- 15. Bạn có kiểm tra tệp rvmrc của mình không?
- 16. Bạn có thể thay đổi giá trị mặc định của thuộc tính nillable trong JAXB không?
- 17. Kiểm tra những gì bạn bay, bay những gì bạn kiểm tra. [Nguyên tắc của NASA]
- 18. Cách kiểm tra xem một sự kiện có bị chặn không
- 19. Làm cách nào để bạn kiểm tra/thay đổi mã chưa được kiểm tra và không thể kiểm tra?
- 20. Bạn có thể áp dụng một thuộc tính cho nhiều trường trong C# không?
- 21. Bạn có thể có nhiều thuộc tính meta http-equiv không?
- 22. Thuộc tính kiểm tra hộp kiểm Ngọc không được kiểm soát dựa trên điều kiện (nếu)
- 23. Trong mục tiêu C, bạn có thể kiểm tra xem một đối tượng có một thuộc tính hoặc thông điệp cụ thể không?
- 24. Bạn có nhấp chuột phải vào sự kiện Javascript không?
- 25. Làm cách nào để bạn tạo sự kiện có thể hủy trong vb.net
- 26. Django - Bạn có thể sử dụng thuộc tính làm trường trong hàm tổng hợp không?
- 27. JavaScript - cách kiểm tra xem sự kiện đã được thêm
- 28. Bạn có thể kiểm tra không gian đĩa cứng có sẵn với Adobe Air không?
- 29. Bạn có thể lập trình/kiểm tra CUDA trong máy ảo không?
- 30. Bạn có thể chặn thông báo nội dung khi điều chỉnh development.log không?
Đ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
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