2015-04-02 56 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