要擴展標題,我必須創建一對文本框,這些文本框一起指定一個數字範圍(例如,5到10或-17至-17)。這些文本框必須是這樣的,指定下界的文本框必須具有比指定上界的文本框更小的數值。想到一個明顯的解決方案:父表單中的臨時代碼通過檢查它們的值來處理更新事件。雖然這完成了工作,但它讓我感到非常不雅和噁心。配對兩個文本框,使得其中一個的數值必須小於或等於另一個
我懷疑這個問題必須有一個堅實的OO解決方案,但我不確定那會是什麼。我應該如何去做這件事?
要擴展標題,我必須創建一對文本框,這些文本框一起指定一個數字範圍(例如,5到10或-17至-17)。這些文本框必須是這樣的,指定下界的文本框必須具有比指定上界的文本框更小的數值。想到一個明顯的解決方案:父表單中的臨時代碼通過檢查它們的值來處理更新事件。雖然這完成了工作,但它讓我感到非常不雅和噁心。配對兩個文本框,使得其中一個的數值必須小於或等於另一個
我懷疑這個問題必須有一個堅實的OO解決方案,但我不確定那會是什麼。我應該如何去做這件事?
這裏有一個想法 - 創建一個名爲 「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--這在動態佈局方面失去了靈活性,但整齊地封裝了整個交互。另外,從用戶界面的角度來看,如果控件相互影響,那麼它們應該無論如何都應該靠得很近。
非常好。正是我在找什麼。 +1和已接受。 – 2012-07-10 23:08:46
爲什麼不把兩個控件放在UserControl中 - 這個控件然後封裝了你想要的功能。他們甚至可以在UserControl內訂閱相同的更改事件,您可以只檢查發件人以確定哪個框是哪個。 – dash 2012-07-10 21:47:00
我甚至沒有想到這一點。這比將其直接放入父表單中要乾淨得多。 您應該提交該答案。 謝謝! – 2012-07-10 21:50:01
嗯。作爲缺點,DOES將兩個文本框的位置保持爲剛性(除非我爲每個排列創建一個新的UserControl)。雖然這對我的具體使用起作用,但我仍然對Textbox本身的一個機制感興趣(如果需要的話,可以擴展)提供此功能。 – 2012-07-10 21:52:49