为了扩展标题,我必须创建一对文本框,它们一起指定一个数字范围(例如,5 到 10,或 -17 到 -17)。这些文本框必须使得指定下限的文本框的数值必须小于指定上限的文本框的数值。想到一个明显的解决方案:父表单中的临时代码,通过检查更新事件的值来处理更新事件。虽然这可以完成工作,但它让我觉得非常不优雅和恶心。
我怀疑这个问题必须有一个可靠的面向对象的解决方案,但我不确定那会是什么。我该怎么做呢?
这里有一个想法——创建一个名为“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);
正如你所看到的,这个类然后将两者配对并将它们订阅到一个公共事件,我们可以计算出哪个是哪个并执行适当的逻辑。
另一种方法是使用 UserControl - 这在动态布局方面失去了灵活性,但巧妙地封装了整个交互。此外,从 UI 的角度来看,如果控件相互影响,那么它们无论如何都应该靠近在一起。