显示框显示两次C#

时间:2013-11-25 23:00:28

标签: c# textbox messagebox

当用户选择其格式时,我正在对我的ID字段执行验证。验证工作除外,当它显示消息框时,您选择确定,然后它再次重复,然后返回到表单。我在下面提供了我的代码。我使用dialogresult部分来查看是否执行某个操作会阻止问题。这是通过使用其中一个答案中提到的Click事件来解决的。

private void rChkBoxB_ToggleStateChanged(object sender, Telerik.WinControls.UI.StateChangedEventArgs args)
{
    if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
    {
        DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error", 
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        if (dialogresult == DialogResult.OK)
        {
            rChkBoxB.Checked = false;
        }
    }
}

新问题是在click事件后将复选框恢复为false。这是我更新的代码。典型的checkbox.checked = false不会将其更改回false。我使用断点来验证我是否获得了if语句,并且我的复选框的值为false。如何将属性更改回false?

private void rChkBoxB_Click(object sender, EventArgs e)
{
    if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
    {
        DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        if (dialogresult == DialogResult.OK)
        {
            rChkBoxB.Checked = false;
        }
    }
}

4 个答案:

答案 0 :(得分:8)

因为你在对话结果的回报中设置了Checked = false?因此,再次切换状态?

编辑:值得注意的是,您可能正在使用CheckStateChanged事件。因此,您选中复选框(将其设置为true),它会触发,显示MessageBox,您将复选框设置为false,这反过来会导致事件再次触发(您正在更改状态)。

这是您可以使用Click事件的地方,而不是设置标志(建议的解决方案)。这样,当您将复选框设置为false时,在代码中,Click事件将不会触发。在运行时,对于复选框,Click事件将始终打开/关闭复选框,无论您在何处单击复选框。

总之,只需使用Click事件:

    private void rChkBoxB_Click(object sender, EventArgs e)
    {
        if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
        {
            DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            if (dialogresult == DialogResult.OK)
            {
                rChkBoxB.Checked = false;
            }
        }
    }

当然,在您的代码的任何一个版本中,我假设您要实际检查Text> 256,当你检查它是真的。所以你可能想:

    private void rChkBoxB_Click(object sender, EventArgs e)
    {
        if (rChkBoxB.Checked == false) return; // NEW CODE HERE

        if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
        {
            DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            if (dialogresult == DialogResult.OK)
            {
                rChkBoxB.Checked = false;
            }
        }
    }

答案 1 :(得分:2)

代码不是问题,但在rChkBoxB.Checked = false;

时多次调用事件ToggleStateChanged

答案 2 :(得分:0)

问题:只要ToggleStateChanged状态发生变化,就会触发 Checkbox事件。设置rChkBoxB.Checked = false;时,您的复选框状态会发生变化,这就是ToggleStateChanged事件调用两次的原因。

解决方案:当用户选择ok时,取一个bool变量并使其成为真,那​​么即使ToggleStateChanged事件触发它也不会因为设置了isValid而调用该函数两次为真。

bool isValid=false;//declare as class variable

private void rChkBoxB_ToggleStateChanged(object sender, Telerik.WinControls.UI.StateChangedEventArgs args)
{
   if(!isValid)
   {
      if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256)
      {
         DialogResult dialogresult = MessageBox.Show("B does not support numbering over a number!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         if (dialogresult == DialogResult.OK)
         {
            rChkBoxB.Checked = false;
            isValid=true;
         }
         else
         {
            isValid=false;
         }
      }
   }
   else
   {
      isValid=false;
   }
}

答案 3 :(得分:0)

它会运行两次,因为您更改了单选按钮内的checked属性。当您更改它时,CIL会看到它生成一个新标志并再次执行该事件。

为了预测这一点,你可以在第一个控件中添加第二个控件

if (Convert.ToInt32(rTxtBoxFormatID.Text) > 256 && rChkBoxB.Checked)
{
  ///TODO
}

我还建议检查输入是否正确:在这种情况下,您只需要int,这样您就可以使用int.TryParse(string, out int)(参见参考here)或者您可以使用Regex(引用{{3} })