【问题标题】:Passing information back from a UserControl从 UserControl 传回信息
【发布时间】:2009-03-20 19:57:40
【问题描述】:

我刚刚开始了解 UserControl 的概念。

我创建了一个 UserControl 来将在 TabControl 的各个页面上复制的多个控件组合在一起。

其中一些控件是需要验证的文本字段,当验证不成功时,我需要显示错误消息。但是我想显示错误信息的地方是在主窗体的状态栏上。

在这种情况下处理验证/错误显示的最佳方法是什么?

【问题讨论】:

    标签: c# winforms validation


    【解决方案1】:

    要处理验证,请执行以下操作之一:

    • 使用用户控件内的方法进行验证
    • 让您的用户控件具有可以处理验证的delegate 属性(例如ValidationHandler)(这将允许您拥有一个包含大量验证器的类,您可以将它们分配给您的控件)

      public delegate void Validator(...)

      public Validator ValidationHandler { get; set; }

    • 让您的用户控件生成验证请求event(例如ValidationRequested

      public event EventHandler<ValidationEventArgs> ValidationRequested

    要通知系统发生了错误,请执行以下操作之一:

    • 使用感兴趣的各方可以订阅的event(例如ValidationFailed

    • 如果执行验证的对象(通过delegateevent)也是您要从中生成错误消息的对象,它可以自己引发错误消息。

    编辑:

    既然您说过要在控件内部进行验证,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;
    }
    

    【讨论】:

    • +1 我真的很喜欢这个答案。我确实认为这有点涉及,指向参考实现/文章的链接或其他东西会很好地让它继续下去
    • 我在用户控件中进行验证 - 效果很好。我只需要在主窗体上显示错误消息。您能否为我指明如何定义事件和处理订阅的正确方向?
    • 使用ValidationFailed事件,主窗体可以处理该事件
    • @Daniel 当我阅读您的初始答案时,我以为您正在寻找一个各方都使用的通用验证类,这很好,因此您不必订阅每个控制事件在所有使用控件的地方。然后我去找 asp.net 验证器 :)
    • @Freddy:嗯,这就是我要做的(这是我的建议之一)......但是 OP 想要在控件中验证,所以我专注于那个...... .
    【解决方案2】:

    如果您在 UserControl 中进行验证,您可以让它提供一个公共的 ValidationFailed 事件并将消息包含在 EventArgs 中。然后父控件可以订阅 ValidationFailed 事件并更新状态栏。

    【讨论】:

    • 你能帮我扩展一下吗?我对 c# 还很陌生,不知道你会怎么做。感谢所有帮助。
    【解决方案3】:

    您可以在用户控件本身上放置一个验证器,引发异常,或将公共 getter 添加到您希望在父表单中显示的字段。

    【讨论】:

    • 确实如此。一个例外会有点 ewwwwwwww.
    • @Quarrelsome 不仅如此,如果用户控件正在验证加载或任何其他页面事件,它实际上会使整个页面失败。 -1
    【解决方案4】:

    在你的用户控件上创建一个公共方法来验证它的字段,你可以传入一个字符串输出参数。

    类似

        public bool IsValid(out string status)
    {
     // do validation and set the status message
    }
    

    【讨论】:

      【解决方案5】:

      您可以在用户控件中使用 asp.net 验证器,并在主窗体上使用验证摘要,它会为您列出错误。

      对于其他类型的使用,您可以公开一个事件,并让包含该控件的页面订阅该事件并采取任何必要的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多