【问题标题】:Display box showing twice C#显示框显示两次 C#
【发布时间】:2013-11-25 23:00:28
【问题描述】:

当用户选择它的格式时,我正在对我的 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;
        }
    }
}

新问题是在单击事件后将复选框变回 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;
        }
    }
}

【问题讨论】:

  • 我猜rChkBoxB_ToggleStateChanged 被调用了两次。断点并检查它。

标签: c# textbox messagebox


【解决方案1】:

因为您设置 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;
            }
        }
    }

【讨论】:

  • 我之所以这样设置是因为该字段需要正确,因为格式无法处理它。因此,将其留在那里将允许它访问数据库。
  • 是的,因此您需要处理将其切换回的情况。
  • 这让我摆脱了双重通知,但它不会将复选框更改为 false。我正在更新我的帖子以获取新代码。
  • 编辑供您审核。
  • 嘿Kpt。 Khaos - 你确定复选框没有设置为假吗?显示 MessageBox 并确定后,将 checkBox 设置回 false(并且 Click 事件不会再次触发)。那应该行得通。我现在刚刚测试过。
【解决方案2】:

代码不是问题,而是rChkBoxB.Checked = false;时多次调用事件ToggleStateChanged

【讨论】:

  • 你认为你可以看看我的编辑,看看你是否知道如何解决这个问题。
【解决方案3】:

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

为了预料到这一点,您可以在第一个 if 中放置第二个控件

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

我还建议检查输入是否正确:在这种情况下,您只需要 int,因此您可以使用int.TryParse(string, out int)(请参阅参考资料here)或者您可以使用正则表达式(参考资料here

【讨论】:

    【解决方案4】:

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

    解决方案: 取一个bool 变量并在用户选择 ok 时使其为真,那么即使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;
       }
    }
    

    【讨论】:

    • 请稍等,但我想你可能有一些东西在这里。
    • 现在检查我的编辑,您需要添加 onmore else 块以将 isvalid 设置为 false
    • 你认为你可以看看我的编辑,看看你是否知道如何解决这个问题。
    • @Kpt.Khaos : 你确定它正在进入 if 条件并显示消息框吗?
    • 是的,我使用了断点,它得到的值是假的。它只是从不设置复选框。
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2021-07-04
    • 2020-12-14
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多