【发布时间】:2009-03-20 19:57:40
【问题描述】:
我刚刚开始了解 UserControl 的概念。
我创建了一个 UserControl 来将在 TabControl 的各个页面上复制的多个控件组合在一起。
其中一些控件是需要验证的文本字段,当验证不成功时,我需要显示错误消息。但是我想显示错误信息的地方是在主窗体的状态栏上。
在这种情况下处理验证/错误显示的最佳方法是什么?
【问题讨论】:
标签: c# winforms validation
我刚刚开始了解 UserControl 的概念。
我创建了一个 UserControl 来将在 TabControl 的各个页面上复制的多个控件组合在一起。
其中一些控件是需要验证的文本字段,当验证不成功时,我需要显示错误消息。但是我想显示错误信息的地方是在主窗体的状态栏上。
在这种情况下处理验证/错误显示的最佳方法是什么?
【问题讨论】:
标签: c# winforms validation
要处理验证,请执行以下操作之一:
让您的用户控件具有可以处理验证的delegate 属性(例如ValidationHandler)(这将允许您拥有一个包含大量验证器的类,您可以将它们分配给您的控件)
public delegate void Validator(...)
public Validator ValidationHandler { get; set; }
让您的用户控件生成验证请求event(例如ValidationRequested)
public event EventHandler<ValidationEventArgs> ValidationRequested
要通知系统发生了错误,请执行以下操作之一:
使用感兴趣的各方可以订阅的event(例如ValidationFailed)
如果执行验证的对象(通过delegate 或event)也是您要从中生成错误消息的对象,它可以自己引发错误消息。
编辑:
既然您说过要在控件内部进行验证,ValidationFailed 事件的代码可能如下所示:
// In your user control
public class ValidationFailedEventArgs : EventArgs
{
public ValidationFailedEventArgs(string message)
{
this.Message = message;
}
public string Message { get; set; }
}
private EventHandler<ValidationFailedEventArgs> _validationFailed;
public event EventHandler<ValidationFailedEventArgs> ValidationFailed
{
add { _validationFailed += value; }
remove { _validationFailed -= value; }
}
protected void OnValidationFailed(ValidationFailedEventArgs e)
{
if(_validationFailed != null)
_validationFailed(this, e);
}
private void YourValidator()
{
if(!valid)
{
ValidationFailedEventArgs args =
new ValidationFailedEventArgs("Your Message");
OnValidationFailed(args);
}
}
// In your main form:
userControl.ValidationFailed +=
new EventHandler<ValidationFailedEventArgs>(userControl_ValidationFailed);
// ...
private void userControl_ValidationFailed(object sender,
ValidationFailedEventArgs e)
{
statusBar.Text = e.Message;
}
【讨论】:
如果您在 UserControl 中进行验证,您可以让它提供一个公共的 ValidationFailed 事件并将消息包含在 EventArgs 中。然后父控件可以订阅 ValidationFailed 事件并更新状态栏。
【讨论】:
您可以在用户控件本身上放置一个验证器,引发异常,或将公共 getter 添加到您希望在父表单中显示的字段。
【讨论】:
在你的用户控件上创建一个公共方法来验证它的字段,你可以传入一个字符串输出参数。
类似
public bool IsValid(out string status)
{
// do validation and set the status message
}
【讨论】:
您可以在用户控件中使用 asp.net 验证器,并在主窗体上使用验证摘要,它会为您列出错误。
对于其他类型的使用,您可以公开一个事件,并让包含该控件的页面订阅该事件并采取任何必要的操作。
【讨论】: