单击组合框时总是弹出消息框

本文关键字:消息 组合 单击 | 更新日期: 2023-09-27 18:29:09

您好,任何人都可以帮我解决这个问题。。。我有一个组合框和一个文本框。文本框(txtFruitNo)将检查Leave事件下的文本长度。没关系。但如果我在txtFruitNo尚未完成的情况下单击组合框。它需要我首先完成txtFruitNo的长度,然后只有我才能单击组合框。

如果我单击组合框,即使txtFruitNo的长度尚未完成,我也不想显示消息框。

感谢

private void cmbFruitSelection_SelectedIndexChanged(object sender, EventArgs e)
    {
        DateTime thetime = DateTime.Now;
        String varApple = "App-Red";
        String varBanana = "Ban-Yellow";
        if (cmbFruitSelection.SelectedItem.ToString() == "Apple")
        {
            txtFruitNo.Text = varApple.ToString() + thetime.ToString("yyyy");
            txtFruitNo.SelectionStart = txtFruitNo.Text.Length;
            txtFruitNo.MaxLength = 18;
        }
        else if (cmbFruitSelection.SelectedItem.ToString() == "Banana")
        {
            txtFruitNo.Text = varBanana.ToString() + thetime.ToString("yyyy");
            txtFruitNo.SelectionStart = txtFruitNo.Text.Length;
            txtFruitNo.MaxLength = 17;
        }
    }
    private void txtFruitNo_Leave(object sender, EventArgs e)
    {
        if (txtFruitNo.TextLength != txtFruitNo.MaxLength)
        {
            MessageBox.Show("Your fruit number is too short. Please check.");
            txtFruitNo.Focus();
        }
        else
        {
            // Do something here
        }
    }

单击组合框时总是弹出消息框

在什么情况下"水果数"在参数范围内对程序的继续很重要。如果不是在离开焦点时,请尝试将其移动到其他控件,例如"OK"按钮可以运行参数检查,如果有效,则继续标记台面框并返回文本框

由于您的要求是只在用户从组合框中选择值后进行验证并提示消息框,请执行以下操作;

引入形式变量

private bool isComboClicked = false;

将以下行添加到cmbFruitSelection_SelectedIndexChanged

isComboClicked = true;

在上述事件的开头添加上述行将在从组合框中选择值时提示长度验证消息。如果您想在组合框上提示特定值的消息,请将其移动到If语句if (comboBox1.SelectedItem.ToString() == "Apple")等中。

现在,在txtFruitNo_Leave事件中,将代码包含在下面的if条件中。

if (isComboClicked)
{
    // Your Code
    if (txtFruitNo.TextLength != txtFruitNo.MaxLength)
            {
                MessageBox.Show("Your fruit number is too short. Please check.");
                txtFruitNo.Focus();
            }
            else
            {
                // Do something here
            }
}

据我所知:
您在Leave事件处理程序中对TextBox进行了"验证",如果验证失败,它将显示错误消息
但如果TextBox.Leave事件是通过选择ComboBox控件引发的,则必须抑制验证。

创建Panel并只放置txtFruitNocmbFruitSelection控件。

// Validation function
private bool IsTextBoxValid()
{
    return this.txtFruitNo.Length == this.txtFruitNo.maxlength;
}  

然后为Panel创建并连接Validating事件处理程序,在其中验证txtFruitNo

private void Panel_Validating(Object sender, CancelEventArgs e)
{
    if(this.IsTextBoxValid() == false)
    {
        e.Cancel = true;
        MessageBox.Show("Your fruit number is too short. Please check.") ;          
    }
}

只有当焦点移动到面板之外时,才会引发验证
如果e.Cancel = true
,使用Validating事件将阻止自动将焦点更改为外部控件在这种情况下,可以聚焦组合框cmbFruitSelection,用户可以通过从组合框中选择有效值来完成txtFruitNo文本。

我认为使用ErrorProvider控件对用户来说会比使用MessageBox更友好
通过设计器在Form中添加ErrorProvider控件,并在代码中添加几行

private void Panel_Validating(Object sender, CancelEventArgs e)
{
    if(this.IsTextBoxValid() == false)
    {
        e.Cancel = true;
        this.ErrorProvider1.SetError(txtFruitNo, 
                                     "Your fruit number is too short. Please check.");
    }
    else
    {
        this.ErrorProvider1.Clear();
    }
}    

ComboBox 使用有效值后清除错误

private void cmbFruitSelection_SelectedIndexChanged(object sender, EventArgs e)
{
    DateTime thetime = DateTime.Now;
    String varApple = "App-Red";
    String varBanana = "Ban-Yellow";
    if (cmbFruitSelection.SelectedItem.ToString() == "Apple")
    {
        txtFruitNo.Text = varApple.ToString() + thetime.ToString("yyyy");
        txtFruitNo.SelectionStart = txtFruitNo.Text.Length;
        txtFruitNo.MaxLength = 18;
        //Clear error
        this.ErrorProvider1.Clear();
    }
    else if (cmbFruitSelection.SelectedItem.ToString() == "Banana")
    {
        txtFruitNo.Text = varBanana.ToString() + thetime.ToString("yyyy");
        txtFruitNo.SelectionStart = txtFruitNo.Text.Length;
        txtFruitNo.MaxLength = 17;
        //Clear error
        this.ErrorProvider1.Clear();            
    }
}