2016-07-03 226 views
-1

我有TextBoxA和TextBoxB。我想要做的是,只要我在TextBoxA中放置一個數字(是的,兩個文本框的值總是整數),TextBoxB應該使用值(100-TextBoxA)「自動完成」。 TextBoxB也是如此。 TextBoxA和TextBoxB的總和應始終是100根據另一個文本框文本填充文本框

這裏就是我已經嘗試過:

static void TextBoxA_TextChanged()... 
{ 
    int a = Convert.ToInt32(TextBoxA.Text); 
    int b = Convert.ToInt32(TextBoxB.Text); 
    string text = (100-a).ToString(); 
    TextBoxB.Text = text; 
} 

Static void TextBoxB_TextChanged()... 
{ 
    int a = Convert.ToInt32(TextBoxA.Text); 
    int b = Convert.ToInt32(TextBoxB.Text); 
    string text = (100-b).ToString(); 
    TextBoxA.Text = text; 
} 

但它不工作。

+2

什麼部分是不工作?當你說「不起作用」時,你的意思是什麼?會發生什麼呢? –

+0

如果你單步執行代碼,會發生什麼情況..也因爲你不能編寫(100-b),而沒有在每個文本框中顯示什麼值,因此我在文本框中顯示的值是字符串沒有看到需要使用聲明爲int的變量..當你試圖通過'(100-b)'使用string.Concat或string.Join或者只是保持這些值爲它們的原始狀態......這是'字符串' – MethodMan

+0

糾正我,如果我錯了,但不會造成某種形式的循環,因爲一旦一個文本框發生改變,另一個會改變...導致另一個改變......等等等等? –

回答

1

這裏是你可以嘗試什麼:

private void TextBoxA_TextChanged(object sender, EventArgs e) 
{    
    int num = 0; 
    if (int.TryParse(TextBoxA.Text, out num)) 
    { 
     string text = (100 - num).ToString(); 
     TextBoxB.Text = text; 
    } 
} 

private void TextBoxB_TextChanged(object sender, EventArgs e) 
{ 
    int num = 0; 
    if (int.TryParse(TextBoxB.Text, out num)) 
    { 
     string text = (100 - num).ToString(); 
     TextBoxA.Text = text; 
    } 
} 

這將自動完成要麼TextBoxTextChanged事件。

enter image description here

+1

感謝這爲「自動完成」部分 –

+0

作品即使兩者的總和TextBox始終是100 ...也請確保您標記爲已解決,如果這已回答你的問題:) –

0

首先,我不知道爲什麼你的事件處理程序被聲明爲static ..其通常必須是:

private void TextBoxA_TextChanged(object sender, EventArgs e) { } 

其次,你知道,如果你有2個textboxs,而且每一個觸發另一個,你」永遠不會離開TextChanged事件。

要了解我更多,這裏有一個例子:

1您可以設置TextBoxB.text = 「1」;
2- TextBoxB.TextChanged觸發器,它 sets TextBoxA.Text =「2」;
3- TextBoxA.TextChanged觸發器,它設置 TextBoxB.Text =「1」;

它會繼續這樣做直到我相信你會得到一個內存異常。

編輯:opertator' - '在數字上工作。你不能從一個字符串中減去一個數字。他們必須是兩個數字,所以先轉換它們。

編輯2:

這裏有一個代碼,我寫道,工作正常

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     int n; 
     if (int.TryParse(textBox1.Text, out n)) // Check if the text value is a number 
     { 
      if (n > 100) // Since you want a sum of 100 
       return; 

      int m = 100 - n; // remaining 

      if (textBox2.Text != m.ToString()) // to not re-trigger the TextChanged event 
       textBox2.Text = m.ToString(); 
     } 
    } 

    private void textBox2_TextChanged(object sender, EventArgs e) 
    { 
     int n; 
     if (int.TryParse(textBox2.Text, out n)) // Check if the text value is a number 
     { 
      if (n > 100) // Since you want a sum of 100 
       return; 

      int m = 100 - n; // remaining 

      if (textBox1.Text != m.ToString()) // to not re-trigger the TextChanged event 
       textBox1.Text = m.ToString(); 
     } 
    } 
+0

第一個是我的錯誤..道歉!我認爲它不會永遠「循環」,因爲當兩個文本框都有正確的值時,我使用按鈕將這些值發送到2個文本塊。我現在遇到的問題是,如果我錯誤地寫錯了一些錯誤,並嘗試使用鍵盤清除當前值,應用程序將關閉 –

+0

導致「應用程序關閉?」的錯誤是什麼? '附加信息:輸入字符串格式不正確.'? –

+0

我編輯了答案,並添加了我寫的代碼,textbox1是A和textbox2是B,嘗試它並告訴我它是否需要^^ – Haytam

0

試試這個。這是一個更高效,更優雅的方式,我會選擇使用lambda表達式,而不需要重複方法:

private void onChangeDoSum(object sender, EventArgs e, 
           TextBox substractNumber, TextBox sumNumber) 
    { 
     sumNumber.Text = (100 - Int32.Parse(substractNumber.Text)).ToString(); 
    } 


    private void Form1_Load(object sender, EventArgs e) 
    { 
     textBox1.TextChanged += (a, b) => onChangeDoSum(sender, e, textBox1, textBox2); 
     textBox2.TextChanged += (a, b) => onChangeDoSum(sender, e, textBox2, textBox1); 
    } 

或者使用Int32.TryParse以防止意想不到的結果。

0

我認爲你可以做這樣的事情

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     textBox2.Text = (100 - Int32.Parse(textBox1.Text)).ToString(); 
    } 

private void textBox2_TextChanged(object sender, EventArgs e) 
    { 
     textBox1.Text = (100 - Int32.Parse(textBox2.Text)).ToString(); 
    } 

當我看到靜態的話,我想你已經嘗試創建自己這些方法,你忘了添加

textBox1.TextChanged += textBox1_Changed; 

//我看到你寫的其他帖子可能會引發異常和下降。當然可以。您可以使用,如果喜歡

textBox1.Text != null && textBox1.Text != "" 

前值狀態將被改變或的TryParse()方法