2014-01-20 64 views
1

这让我感到非常紧张。我有一个简单的CheckBox,当选中它时,按下按钮时会假设做一些额外的工作。如果CheckBox没有被选中,它不会做额外的工作。简单,你会想。C#复选框选中值不正确

private void previewButton_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show(mfsCheckbox.CheckState.ToString()); 
    if (mfsCheckbox.CheckState == CheckState.Checked) 
    { 
     //never gets here 
     //do extra stuff 
    } 
    if (mfsCheckbox.Checked) 
    { 
     //never gets here 
     //do extra stuff 
    } 
} 

private void mfsCheckbox_CheckedChanged(object sender, EventArgs e) 
{ 
    MessageBox.Show(mfsCheckbox.CheckState.ToString()); 
    if (mfsCheckbox.Checked) 
    { 
     mfsCheckbox.Checked = true; 
     mfsCheckbox.CheckState = CheckState.Checked; 
    } 
} 

当运行这段代码中,选中该复选框,并按照CheckChanged事件代码,它说:“经过”。为了更好的衡量,我甚至在CheckChanged事件中设置了这两个状态,以确保它们被正确设置。然后,我直接点击预览按钮后,它刚刚告诉我CheckBox是“选中”,它说“未选中”,并不会运行我的if语句...

基本上,它从Checked到Unchecked,即使当我可以直观地看到它仍然被检查,并且在我通过编程确保它的状态应该被“检查”之后。

感谢您的任何帮助。

更新:初始代理被另一个模块通过STRAY代码调用。我会承担责任,在夜间服务器构建生活作为惩罚责任。投票结束,因为这对任何人都没有价值。

+0

如果我没有错误复选框的值尚未在事件处理程序中设置。这可能是问题吗? –

+0

物业ThreeState的价值是多少? – Steve

+0

ThreeState在声明事件处理程序MessageBox中的“已检查”后为假。 – CODe

回答

1

MSDN说,在CheckBox.CheckState

如果ThreeState属性设置为false时,CheckState属性 值只能设置为CheckState.Indeterminate的代码,而不是由 用户交互。

看来你需要一个不同的方法,如果你想只有当CheckState是经过

您可以添加在第一个检查出时,才启用另一个复选框来执行代码

private void mfsCheckbox_CheckedChanged(object sender, EventArgs e) 
{ 
    checkForExtraStuff.Enabled = mfsCheckbox.Checked; 
} 

private void previewButton_Click(object sender, EventArgs e) 
{ 
    if (mfsCheckbox.Checked) 
    { 
     //do basic stuff 
     if (checkForExtraStuff.Checked) 
     { 
      //do extra stuff 
     } 
    } 
} 
+0

Checked Property值如何?不同的方法会是什么样子?我在此之前使用过CheckBox.Checked属性,现在只有这样才能... – CODe

+0

检查可能只是真/假,因此它不适用于三态标志。根据您的要求,最好添加另一个复选框,如果第一个复选框未选中,并且在第一个复选框被选中时启用。此时用户可以设置检查第二个复选框。 (在许多配置形式中看到) – Steve

+0

我需要确定的是如果它被检查或不。我使用CheckState只是因为Checked没有工作出于某种原因,这真的是我想弄明白的。 – CODe