2012-07-10 57 views
0

要擴展標題,我必須創建一對文本框,這些文本框一起指定一個數字範圍(例如,5到10或-17至-17)。這些文本框必須是這樣的,指定下界的文本框必須具有比指定上界的文本框更小的數值。想到一個明顯的解決方案:父表單中的臨時代碼通過檢查它們的值來處理更新事件。雖然這完成了工作,但它讓我感到非常不雅和噁心。配對兩個文本框,使得其中一個的數值必須小於或等於另一個

我懷疑這個問題必須有一個堅實的OO解決方案,但我不確定那會是什麼。我應該如何去做這件事?

+1

爲什麼不把兩個控件放在UserControl中 - 這個控件然後封裝了你想要的功能。他們甚至可以在UserControl內訂閱相同的更改事件,您可以只檢查發件人以確定哪個框是哪個。 – dash 2012-07-10 21:47:00

+0

我甚至沒有想到這一點。這比將其直接放入父表單中要乾淨得多。 您應該提交該答案。 謝謝! – 2012-07-10 21:50:01

+0

嗯。作爲缺點,DOES將兩個文本框的位置保持爲剛性(除非我爲每個排列創建一個新的UserControl)。雖然這對我的具體使用起作用,但我仍然對Textbox本身的一個機制感興趣(如果需要的話,可以擴展)提供此功能。 – 2012-07-10 21:52:49

回答

1

這裏有一個想法 - 創建一個名爲 「TextBoxManager」 類:

public class TextBoxManager 
{ 

    public List<Tuple<TextBox, TextBox>> LowerHigherPairs { get; set; } 


    public TextBoxManager() 
    { 
     LowerHigherPairs = new List<Tuple<TextBox, TextBox>>(); 
    } 


    public void RegisterTextBoxes(TextBox lower, TextBox higher) 
    { 
     lower.Leave += TextBoxFocusLost; 
     higher.Leave += TextBoxFocusLost; 
     LowerHigherPairs.Add(new Tuple<TextBox, TextBox>(lower, higher)); 

    } 



    public void TextBoxFocusLost(object sender, EventArgs e) 
    { 

     TextBox senderBox = sender as TextBox; 

     Tuple<TextBox, TextBox> matchingPair = LowerHigherPairs.Find(x => x.Item1 == senderBox || x.Item2 == senderBox); 

     if (matchingPair != null) 
     { 

      if (matchingPair.Item1 == senderBox) 
      { 
       //We know we should compare with the value in Item2.Text 
      } 
      else 
      { 
       //We know we should compare with the value in Item1.Text 
      } 

     } 

    } 


} 

在您的形式,把這個聲明爲一個類級別的變量:

TextBoxManager higherLowerManager = new TextBoxManager(); 

然後,在你的表單OnLoad事件,只需註冊一對您想要管理的文本框:

higherLowerManager.RegisterTextBoxes(lowerEntryTextBox, higherEntryTextBox); 

正如你所看到的這個類將t母雞將兩者結合起來,並將它們訂閱到一個共同的事件中,在那裏我們可以確定哪個是哪個並執行適當的邏輯。

另一種方法是使用UserControl--這在動態佈局方面失去了靈活性,但整齊地封裝了整個交互。另外,從用戶界面的角度來看,如果控件相互影響,那麼它們應該無論如何都應該靠得很近。

+0

非常好。正是我在找什麼。 +1和已接受。 – 2012-07-10 23:08:46

相關問題