2015-04-02 55 views
0

我有一个相当大的代码,所以我不会把它放在这里...... 我做了一些计算,其工作,现在我想修复某些东西。如果条件不满足,回报beggining并没有做任何事情

我与声明回路形成:如果(我的条件)是真突破和 保存,否则,如果(条件是不正确的)显示消息框,并报告有什么 是错误的(如例如输入为0,不应该0)。但之后 我的计算一直持续到结束,不停止。如何停止 那里直到我的状况不满意?

什么与回报?我在 按钮点击私人无效功能..这困扰我因为我的程序有很多 如果条件与显示/隐藏选项。所以,当程序继续 计算它表明大量的0和坏的数字..

我调用这个函数(单选按钮选中)与另一个(点击按钮) 里面输入if语句是从文本框转换为数字

if (Math.Abs(miSdCrtica - _dMiSd) < 0.01) 
{ 
    epsilonS1 = epsilonS1Pretpostavka; 
    zeta = zetaRacunska; 
    ksi = ksiRacunski; 
    xNeutralnaOs = ksi * _dd; 
    zKrakSila = zeta * _dd; 
    racunskiAs1 = (_dMed * 1000)/(zeta * _dd * dFyd); 
    break; 
} 
else if (_dMiSd < 0.086) 
{ 
    MessageBox.Show("Error - check input"); 
    return; 
} 

而这个错误之后 - 检查输入的东西,代码会继续给我一串零的(0)

我希望这有助于澄清一些THI NGS

问题演示

我对UI一些texboxes,单选按钮,从2个条件和按钮计算选择

单选

private void combobox_indexChanged() 
    if statement (radiobutton checked) 
    for loop (written above) 
     if statement (written above) 
     else if statement (written above) 

按钮点击

private void button clicked() 
    calls radiobutton checked (do calculation) 
     hide/show bunch of labels (their results are 0 with else if statement from above) 

如何阻止它,所以当显示MessageBox.Show("Error - check input");,按一下按钮功能不能继续隐藏/显示标签,但停止,直到UI是正确的?

我希望现在很清楚我想要做什么

+0

看看'while'关键字。 – 2015-04-02 21:09:55

+2

如果您尝试添加一些演示特定场景的代码,那么您可能会得到更好的帮助。诸如“一直到最后,不停止”之类的东西可以被解释为十几种不同的方式。 – AaronLS 2015-04-02 21:10:03

+0

即使代码不完整/不工作,您可以添加注释'//在这里我希望它跳到函数的结尾,而不是继续'来表达您的愿望 – AaronLS 2015-04-02 21:11:34

回答

0

从描述,我想你的按钮单击事件看起来像:

void Button1_Click(...){ 
    if(radioButton1.Checked){ 
     RadioButton1Checked(); 
    } 
    if(radioButton2.Checked){ 
     SomeOtherFunction(); 
    } 
    ... 
} 

void RadioButton1Checked(){ 
    for(...){ 
     //code from the question 
    } 
} 

你不希望其他代码运行如果RadioButton1Checked代码“失败”。所以你可以改变这个函数返回bool

bool RadioButton1Checked(){ 
    for(...){ 
     if (Math.Abs(miSdCrtica - _dMiSd) < 0.01) 
     { 
      //... 
      racunskiAs1 = (_dMed * 1000)/(zeta * _dd * dFyd); 
      break; 
     } 
     else if (_dMiSd < 0.086) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

void Button1_Click(...){ 
    if(radioButton1.Checked){ 
     if(!RadioButton1Checked()){ //if the function returns false 
      //Display message box 
      return; 
     } 
    } 
    if(radioButton2.Checked){ 
     if(!SomeOtherFunction()){ 
      //Display message box 
      return; 
     } 
    } 
    ... 
} 

另外,你可以从你的函数抛出一个ArgumentException并且捕获它。

else if (_dMiSd < 0.086) 
{ 
    //I suggest you to specify which input exactly is faulty 
    throw new ArgumentException("Error - check input"); 
} 

void Button1_Click(...){ 
    try{ 
     if(radioButton1.Checked){ 
      RadioButton1Checked(); 
     } 
     if(radioButton2.Checked){ 
      SomeOtherFunction(); 
     } 
     ... 
    }catch(ArgumentException e){ 
     MessageBox.Show(e.Message); 
    } 
} 

一般的建议是,你使所有的计算函数参数化。一个函数应该只接受一组参数,并根据这些参数计算结果(没有在函数范围外声明的变量 - 即类成员或全局变量)。

我假设你有这样的:

class ...{ 
    double epsilonS1; 
    double zeta; 

    void Button_Click(..){ 
     double.Parse(textBoxEpsilon.Text, out epsilonSi); 
     zeta = 0.02; 
     Calculate(); 
    } 

    void Calculate(){ 
     epsilonS1 = epstilonS1 * zeta * 0.01f; 
    } 

}

问题的是,如果你的计算过程中需要失败 - 那么你已经改变了很多你的“全球性”的变量,并回到之前的状态并不容易(在调用函数之前)。

取而代之的是,尽量让你的功能,像这样:

class ...{ 
    void Button_Click(..){ 
     double epsilon = 0; 
     double.Parse(textBoxEpsilon.Text, out epsilon); 
     double result = Calculate(epsilon, zeta); 
    } 

    //function takes parameters, and returns a result. 
    //It neither reads nor changes variables that are outside its scope 
    double Calculate(double epsilonS1, double zeta){ 
     return epsilonS1 * zeta * 0.01f; 
    } 

}

如果这样写的函数调用失败,你可以肯定的是它并没有改变任何全局变量,所以程序'状态'与调用函数之前的状态相同。

是的,这是一个很长的答案,需要说的很多(并且假设我没有看到你的代码)。


P.S.

RadioButton.Checked值是函数的良好参数(与计算相关的那些参数 - 仅用于指示UI是否应显示值的参数应该留在外面)。您可以将这些值传递给该函数,并根据它们进行计算(或调用其他函数),而不是根据复选框值调用(我假定您正在执行的操作)很多单个函数。

void Calculate(double epsilon, double zeta, bool calculatePhi, bool showZulu){ 
    epsilon = zeta * 0.01; 
    if(calculatePhi){ 
     phi = epsilon/2; 
     if(phi < 0.1) 
      throw new ArgumentException("Invalid input - epsilon"); 
    } 
} 

如果你需要从一个函数返回多个值,一个简单的方法是创建一个类将包含这些值,然后返回一个类的实例。

class Result{ 
    public double Epsilon {get; set;} 
    public double Zeta {get;set;} 
    ... 
    public bool DisplayZeta {get;set;} 
} 

而且你的计算功能可能看起来像:

Result Calculate(double epsilon, double zeta, bool calculatePhi, bool showZulu){ 
    Result result = new Result(); 
    result.Epsilon = zeta * 0.01; 
    if(showZulu){ 
     result.DisplayZeta = true; 
    } 

    return Result; 
} 

顺便说一句,当你需要做的的计算,不把他们在事件处理程序,使专门的功能(方法)执行它们。不要在RadioButton_Checked(...)事件中进行计算,而是在Calculate()方法中执行此操作,您可以从事件处理函数和按钮单击操作。

+1

第一块代码是唯一的问题,我忘记提到的是它是私人无效的comboBox_indexchanged,并在那是如果语句(单选按钮已更改) - > 私人无效radiobutton定义外部并在comboBox中调用,因为它从数据comboBox和使用它们... 在第三代码块错误值不能指定,因为_dMiSd是计算值... 因为我是一个begginer我想我会需要重写我的代码更好的方式,我会使用你的建议。感谢分配努力... Veliki pozdrav :) – 2015-04-02 22:18:53

+0

当输入有问题时,最好给用户一个关于什么可能是错误的提示(可能列出多个字段?)。 Pozdrav! :) – neeKo 2015-04-02 22:22:08

1

只需使用“return”即可在任何想停止执行的地方退出无效方法。

+0

当我把回报结束它只停止我目前的执行,但其他一个继续...我想停止它,并返回开始的“stoped”一个 – 2015-04-02 21:36:02

+0

不知道如果我说得对,当你说“另一个继续”。你能提供一些片段,所以我可以告诉你,你可以做什么。 – XtremeBytes 2015-04-02 21:37:57

+0

我将用一些简单的问题编辑我的问题...... – 2015-04-02 21:39:25

0

为什么不在线break;上放一个断点?这可能有助于了解您的号码发生了什么,并确保您传递正确的值。

在Visual Studio中在断点处停止,鼠标都在你的代码的变量,并确保他们是有意义的。

如果您发现某些看起来不正确的东西,那么您更接近于找出问题。

+0

一切都可以,只要转到另一个函数就可以了..当错误是抛出我需要返回的用户输入,但相反,计算继续下去,只有这种无效的方法停止,但另一个(这是真正的按钮点击计算)继续,并给我零... – 2015-04-02 21:30:03

+0

然后,你需要告诉任何停止的功能。就像XtremeBytes所说,如果一个方法需要停止的条件满足了,使用'return;'。这是由你来弄清楚是什么情况。 – 2015-04-02 21:33:04