C# 从用户控件传回信息

C# 从用户控件传回信息,c#,winforms,validation,C#,Winforms,Validation,我刚刚开始掌握UserControl的概念 我创建了一个UserControl,将在TabControl的各个页面上复制的多个控件组合在一起 其中一些控件是需要验证的文本字段,当验证失败时,我需要显示错误消息。但是,我要显示错误消息的位置是在主窗体的状态栏上 在这种情况下,处理验证/错误显示的最佳方法是什么?您可以将验证程序放在用户控件本身上,引发异常,或者将公共getter添加到要在父窗体中显示的字段中。您可以将验证程序放在用户控件本身上,引发异常,或者将公共getter添加到要在父窗体中显示

我刚刚开始掌握UserControl的概念

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

其中一些控件是需要验证的文本字段,当验证失败时,我需要显示错误消息。但是,我要显示错误消息的位置是在主窗体的状态栏上


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

您可以将验证程序放在用户控件本身上,引发异常,或者将公共getter添加到要在父窗体中显示的字段中。

您可以将验证程序放在用户控件本身上,引发异常,或者将公共getter添加到要在父窗体中显示的字段。

在usercontrol上创建一个公共方法,验证其字段,然后可以传入字符串输出参数

大概是

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

在usercontrol上创建一个验证其字段的公共方法,然后可以传入一个字符串输出参数

大概是

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

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

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

    公共委托无效验证程序(…)

    public Validator ValidationHandler{get;set;}

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

    请求的公共事件事件处理程序验证

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

  • 使用相关方可以订阅的许可证(例如,
    ValidationFailed

  • 如果执行验证的对象(通过
    委托
    事件
    )也是要从中生成错误消息的对象,则它可以引发错误消息本身

编辑:

由于您说过要在控件内进行验证,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;
}
//在用户控件中
公共类验证失败EventTargets:EventArgs
{
公共验证失败事件目标(字符串消息)
{
this.Message=消息;
}
公共字符串消息{get;set;}
}
私有EventHandler\u验证失败;
公共事件事件处理程序验证失败
{
添加{u validationFailed+=value;}
删除{u validationFailed-=value;}
}
受保护的void OnValidationFailed(ValidationFailedEventArgs e)
{
如果(_validationFailed!=null)
_验证失败(此,e);
}
私有无效验证器()
{
如果(!有效)
{
ValidationFailedEventArgs参数=
新验证失败事件目标(“您的邮件”);
OnValidationFailed(args);
}
}
//以您的主要形式:
userControl.ValidationFailed+=
新事件处理程序(userControl_ValidationFailed);
// ...
私有void userControl_验证失败(对象发送方,
验证失败事件(e)
{
statusBar.Text=e.Message;
}

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

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

    公共委托无效验证程序(…)

    public Validator ValidationHandler{get;set;}

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

    请求的公共事件事件处理程序验证

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

  • 使用相关方可以订阅的许可证(例如,
    ValidationFailed

  • 如果执行验证的对象(通过
    委托
    事件
    )也是要从中生成错误消息的对象,则它可以引发错误消息本身

编辑:

由于您说过要在控件内进行验证,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;
}
//在用户控件中
公共类验证失败EventTargets:EventArgs
{
公共验证失败事件目标(字符串消息)
{
this.Message=消息;
}
公共字符串消息{get;set;}
}
私有EventHandler\u验证失败;
公共事件事件处理程序验证失败
{
添加{u validationFailed+=value;}
删除{u validationFailed-=value;}
}
受保护的void OnValidationFailed(ValidationFailedEventArgs e)
{
如果(_validationFailed!=null)
_验证失败(此,e);
}
私有无效验证器()
{
如果(!有效)
{
ValidationFailedEventArgs参数=
新验证失败事件目标(“您的邮件”);
OnValidationFailed(args);
}
}
//以您的主要形式:
userControl.ValidationFailed+=
新事件处理程序(userControl_ValidationFailed);
// ...
私有void userControl_验证失败(对象发送方,
验证失败事件(e)
{
statusBar.Text=e.Message;
}

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

如果您在UserControl中执行验证,则可以让它提供公共ValidationFailed事件并将消息包含在