【问题标题】:incrementing errorProvider in a validation loop在验证循环中递增 errorProvider
【发布时间】:2018-09-18 08:14:14
【问题描述】:

我的表单中有 5 个错误提供程序控件,它们对应于 5 个文本框,我正在尝试遍历每个文本框并对其执行一些验证,例如文本框是否为空

如果文本框为空,我希望相应的错误提供程序控件显示错误消息,但是 我在如何增加 errorprovider 时遇到了麻烦, 例如 errorProvider [count] 每次验证循环后计数都会增加

 private void ValidateForm(){
    int count = 1;
    foreach (TextBox tb in this.Controls.OfType<TextBox>()){
        if(string.IsNullOrWhiteSpace(tb.Text)){
           errorProvider1.SetError(tb, "Please enter a value");
           //errorProvider[count].SetError(tb, "Please enter a value");
        }
        count ++;
    }
 }

【问题讨论】:

  • 开始只使用一个 ErrorProvider 来解决这个问题,使用多个没有优势。接下来看看this Q+A

标签: c#


【解决方案1】:

作为快速补丁,你可以尝试使用Reflection

  using System.Reflection;

  ...

  foreach (TextBox tb in this.Controls.OfType<TextBox>()) {
    ...
    // Obtain errorProvider[count] via Reflection
    ErrorProvider provider = GetType()
      .GetField($"errorProvider{count}", BindingFlags.Instance | BindingFlags.NonPublic)
      .GetValue(this) as ErrorProvider;

    provider.SetError(tb, "Please enter a value");
    ... 
  }

如果有更详细的解决方案,您可以将ErrorProviders 组织成一个集合,比如数组:

  private ErrorProvider[] m_Providers;

  public MyForm() {
    InitializeComponent();

    //TODO: Think on which providers should be included
    m_Providers = new ErrorProvider[] {
      errorProvider1,
      errorProvider2,  
      errorProvider3,
      errorProvider4,
      errorProvider5,
    };
  }

那你就可以放

  foreach (TextBox tb in this.Controls.OfType<TextBox>()) {
    ...
    // Now, errorProviderCount can be taken from the collection
    m_Providers[count - 1].SetError(tb, "Please enter a value");
    ...
  }

【讨论】:

  • 这会进入我的 for 循环吗?
  • @Eznx: 是的,反射或数组寻址都应该在foreach 内;我已经编辑了答案
猜你喜欢
  • 2013-12-26
  • 2011-11-03
  • 2018-12-02
  • 2021-09-06
  • 2013-01-12
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多