我有一个组合框,里面有一些单选按钮。我试图在Code Project的教程的帮助下实现序列化。该教程支持复选框的序列化,而不支持单选按钮。所以我需要在我的应用程序中将单选按钮设置为复选框(即它们应该是复选框,但工作方式类似于radiobutton)。
我尝试编写代码,但是当我发现选中某个特定的复选框并且我去取消选中或反之后,它会触发check_changed事件处理程序并进入无限循环。
有人可以帮我解决这个问题吗?
由于
更新:
看到你的回复后,我想多多感谢。是的,你没关系我们不应该搞乱基本属性。我将使用更改序列化方法。
P.S本教程的链接是http://www.codeproject.com/KB/dialog/SavingTheStateOfAForm.aspx
最终更新:
按照此处发布的回复后,我决定不更改默认属性,而是更改序列化程序代码。我做到了,它现在完美无缺。非常感谢大家。
答案 0 :(得分:5)
我同意所有评论者的观点:不要使复选框像单选按钮那样,它会面对UI惯例并使用户感到困惑。
执行此操作的正确方法是修复代码以序列化单选按钮,但如果没有看到代码,则很难知道如何帮助您。首先,您可以通过在执行任何操作之前临时删除事件处理程序来修复CheckedChanged
循环。例如:
myCheckBox.CheckedChanged -= MyCheckedChangedEventHandler;
myCheckBox.Checked = true;
myCheckBox.CheckedChanged += MyCheckedChangedEventHandler;
如果仅此问题无法解决您的问题,请向我们展示您的代码,我们会尽力提供帮助。
编辑:根据您的更新中列出的教程,我猜您在调用FormSerialisor.Deserialise()
时会发生问题,这会触发您的控件的事件处理程序触发?如果是这种情况,快速修复就是按照我提到的做法:在调用FormSerialisor.Deserialise()
之前删除单选按钮事件处理程序,然后再重新添加它们。例如:
myRadioButton.CheckedChanged -= MyCheckedChangedEventHandler;
FormSerialisor.Deserialise(this, mySerialisepath);
myRadioButton.CheckedChanged += MyCheckedChangedEventHandler;
您可能还需要编辑FormSerialisor类来处理RadioButtons;只需复制处理复选框的代码,但更改对RadioButton的所有引用。从您的问题不清楚这一步是否有必要。
答案 1 :(得分:1)
就像评论所说的那样,你最好使用单选按钮进行序列化,而不是搞乱复选框。话虽如此,为了获得您需要的效果,只需设置一个变量,表明您已经在处理更改事件,并对其进行测试。像这样的东西(这是可怕的代码,但证明了这个想法):
private bool autoChange = false;
private void ChangeHandler() {
if (!autoChange) {
autoChange = true;
/* Do stuff */
autoChange = false;
}
}
答案 2 :(得分:1)
在执行此操作之前,从Checked
事件取消注册(使用-=
)。完成后重新注册。
(我不是在评论。只是回答这个问题。)
答案 3 :(得分:1)
您好,这里是将CheckBox转换为RadioButton的简单答案:
object clickBox = null;
private void checkBox_Click(object sender, EventArgs e)
{
clickBox = sender;
foreach (Control c in this.Controls)
{
if (c is CheckBox)
{
if (c != clickBox)
{
((CheckBox)c).Checked = false;
}
}
}
并在每个复选框中添加此Click事件 完成
答案 4 :(得分:0)
使用 CheckedListBox 并调用 ItemCheck 事件并使用下面的代码,它的行为类似于单选按钮(对我有用):-< / p>
private void chkListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
{
for (int item = 0; item < chkListBox.Items.Count; item++)
{
chkListBox.SetItemChecked(item, false);
}
}
}