单击组合框时始终弹出消息框

时间:2016-01-06 04:00:06

标签: c# winforms

美好的一天,任何人都可以帮我解决这个问题...我有一个组合框和一个文本框。文本框(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
        }
    }

3 个答案:

答案 0 :(得分:0)

对于程序的继续而言,“水果编号”在参数范围内的重要性。如果它不是在离开焦点时尝试将其移动到不同的控件,例如“OK”按钮可以运行参数检查,如果有效则继续,如果没有标记消息框并返回到文本框

答案 1 :(得分:0)

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

引入表单变量

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
            }
}

答案 2 :(得分:0)

据我了解:
你有"验证"在TextBox eventhandler中的Leave上,如果验证失败则会显示错误消息 但是,如果通过选择TextBox.Leave控件引发ComboBox事件,则必须禁止验证。

创建Panel并仅设置txtFruitNocmbFruitSelection个控件。

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

然后为Validating创建并挂钩Panel eventhandler,您将在其中验证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.") ;          
    }
}

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

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

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();            
    }
}