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