在先前的方法中满足防止其他方法在条件下运行

时间:2014-09-13 03:19:40

标签: c# winforms visual-studio-2012

我的问题是当用户点击myButton时程序运行得很好。但是,如果用户要在第一个文本框中输入小于3的值,则会向用户显示一个消息框,指出该值必须大于3米。如果单击“确定”,myButton中的下一个方法仍会运行,无论如何都会显示结果消息框。

我已经尝试过使用Nested For Loops来解决我的这个问题,但未能让它们工作(很可能是我的错误)。我也不想使用Goto,因为它不是很好的编程习惯。当然,如果你想要,你可以告诉我:)。

// Button
private void myButton_Click(object sender, EventArgs e)
        {
            checkIfNumericalValue();
            testIfTextBoxOnesMinimumIsMet();
            testIfTextBoxTwosMinimumIsMet();
            displayResultToUser();
            resetOrClose();
        }

// Textbox One
public void testIfTextBoxOnesMinimumIsMet() 
        {
            if (length < 3) 
            {
                MessageBox.Show("length must be greater than 3 metres");
            }
        }

非常感谢帮助这也是我在Visual Studio 2012上第二次尝试C#。不要担心这与我的10年级学校教育无关,因为我的学校没有编程主题。 testIfTextBoxOnesMinimumIsMet()和testIfTextBoxOnesMinimumIsMet()中也会出现此问题,但如果有人可以帮我解决这个方法,我应该能够解决其余问题:)

3 个答案:

答案 0 :(得分:1)

您似乎需要一些其他变量来跟踪您是否遇到过错误。为此,您可以定义bool noErrors变量,如果没有错误,您应该从错误检查方法返回一个布尔值True,否则False。这样你就知道你是否遇到过任何问题。

最后,在运行任何其他方法之前,应检查errrorsFound的状态。

例如:

// Button
private void myButton_Click(object sender, EventArgs e)
{
    bool noErrors = 
        isNumericalValue() &&
        textBoxOnesMinimumIsMet() &&
        textBoxTwosMinimumIsMet();

    if (noErrors)
    {
        displayResultToUser();
        resetOrClose();  // I'm not sure if this should happen regardless of errors?
    }        
}

// Textbox One
public bool textBoxOnesMinimumIsMet() 
{
    if (length < 3) 
    {
        MessageBox.Show("length must be greater than 3 metres");
        return false;
    }

    return true;
}

答案 1 :(得分:1)

所以,如果我正确理解这一点,如果文本框包含数值,文本框1符合最小值,文本框2符合最小值,则需要displayResultToUser()然后resetOrClose()。

如果是这种情况,你可以使用3种方法checkIfNumericalIalmerical(),testIfTextBoxOnesMinimumIsMet()和testIfTextBoxTwosMinimumIsMet()根据最小条件返回bool,然后写下这样的内容:

private void myButton_Click(object sender, EventArgs e)
{
    if (checkIfNumericalValue() && testIfTextBoxOnesMinimumIsMet(Convert.ToInt32(txtBoxOne.Text)) && testIfTextBoxTwosMinimumIsMet(Convert.ToInt32(txtBoxTwo.Text)))
    {
        displayResultToUser();
        resetOrClose();
    }
}

public bool testIfTextBoxOnesMinimumIsMet(int length)
{
    if (length < 3)
    {
        MessageBox.Show("length must be greater than 3 metres");
        return false;
    }

    return true;
}

答案 2 :(得分:1)

您可以从内部函数中throw exception并从按钮的函数中捕获它,如下所示:

// Button
private void myButton_Click(object sender, EventArgs e)
{
    try
    {
        checkIfNumericalValue();
        testIfTextBoxOnesMinimumIsMet();
        testIfTextBoxTwosMinimumIsMet();
        displayResultToUser();
        resetOrClose();
    }
    catch (ArgumentException ex)
    {
        // The error message we defined at the exception we threw
        MessageBox.Show(ex.Message);
    }
}

// Textbox One
public void testIfTextBoxOnesMinimumIsMet() 
{
    if (length < 3) 
    {
        throw new ArgumentException("Length must be greater than 3 meters.");
    }
}

另一种方法是在按钮内处理验证,如下所示:

// Button
private void myButton_Click(object sender, EventArgs e)
{
    checkIfNumericalValue();
    if (length < 3) 
    {
        MessageBox.Show("Length must be greater than 3 meters.");
        return;
    }
    testIfTextBoxTwosMinimumIsMet();
    displayResultToUser();
    resetOrClose();
}

上面发生的是 return 会离开该功能而无需进一步处理其他内容。