6

次のコードがあります。

private void btnOK_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(tbVendorName.Text))
        {
            VendorName = tbVendorName.Text;
            if (!string.IsNullOrEmpty(rtbVendorAddress.Text))
            {
                VendorAddress = rtbVendorAddress.Text;
                if (!string.IsNullOrEmpty(tbVendorEmail.Text))
                {
                    VendorEmail = tbVendorEmail.Text;
                    if (!string.IsNullOrEmpty(tbVendorWebsite.Text))
                    {
                        VendorWebsite = tbVendorWebsite.Text;
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show("Vendor Website Required");
                    }
                }
                else
                {
                    MessageBox.Show("Vendor email is required");
                }
            }
            else
            {
                MessageBox.Show("Vendor address is required");
            }
        }
        else
        {
            MessageBox.Show("Vendor name is required");
        }
    }

しかし、それはただ恐ろしいように見えます。より良い方法はありますか?または、コードをより読みやすくする代替方法でさえありますか?

4

14 に答える 14

8

より良い方法は、 MVVMパターンをマスターすることです。そこで ViewModel を作成し、そこですべての入力データを定義できます。

class VendorViewModel
{
    [Required]
    public string Name { get; set; }

    public string Website { get; set; }

    [Regex("regex for email")]
    public string Email { get; set; }

    [MaxLength(160)]
    public string Address { get; set; }
}

次に、フレームワークは、各テキストボックスまたはその他の入力要素の後に入力エラー (ある場合) を表示します。ボタンの Enable プロパティは、正しく検証されたすべてのフィールドに従って自動的に設定されます。

于 2013-09-02T07:10:09.803 に答える
3

それをメソッドに入れ、有効かどうかのブール値をメソッドから返します。

 private void btnOK_Click(object sender, EventArgs e)
{
    if(!Validate())
    {
        //Invalid
    }
    //Valid so set details
}

private bool Validate()
{
     if (!string.IsNullOrEmpty(tbVendorName.Text))
     {
          MessageBox.Show(...);
        return false;
     }

    return true;
}
于 2013-09-02T07:07:00.410 に答える
2

ここでの回答で見たことがなく、私が好きなパターンの 1 つは、 を使用した検証yield returnです。属性ベースの検証ほどクリーンではありませんが、多くのシナリオに合わせて簡単にカスタマイズでき、プロジェクトでうまく機能しWinFormsます。

また、一度に 1 つずつではなく、すべてのエラーを一度に返します。

private void btnOK_Click(object sender, EventArgs e)
{
    var errors = Validate();

    if (errors.Any())
    {
        var sb = new StringBuilder();
        sb.AppendLine("The following errors were found:");
        foreach (var error in errors)
        {
            sb.AppendLine(error);
        }
        MessageBox.Show(sb.ToString());
        return;
    }
}

private IEnumerable<string> Validate()
{
    if (string.IsNullOrEmpty(tbVendorName.Text))
    {
        yield return "Vendor name missing";
    }
    if (string.IsNullOrEmpty(rtbVendorAddress.Text))
    {
        yield return "Vendor address missing";
    }
    if (string.IsNullOrEmpty(tbVendorEmail.Text))
    {
        yield return "Vendor email missing";
    }
}
于 2013-09-02T08:05:16.693 に答える
1
private void btnOK_Click(object sender, EventArgs e)
        {
            var box = Controls.OfType<TextBox>().Any(x => !Validate(x));
            if (!box)
            {
                VendorName = tbVendorName.Text;
                VendorAddress = rtbVendorAddress.Text;
                VendorEmail = tbVendorEmail.Text;
                VendorWebsite = tbVendorWebsite.Text;
            }
        }

         private bool Validate(TextBox box)
         {
             if (!String.IsNullOrEmpty(box.Text)) return true;
                 MessageBox.Show(@"vender " + new List<string> {"name","email","website","address"}
                .Single(x => box.Name.ToLower().Contains(x)) + @" is required!...");
           return false;
         }
于 2013-09-02T08:04:22.007 に答える
1

コレクションを制御し、そのタイプを確認してから、次のような検証を適用できます

foreach(Control c in this.Controls)
 {
      //Check if it's input control    
      if(c is TextBox)
      {
             if (string.IsNullOrEmpty(c.Text))
              {
                 MessageBox.Show("Value Required");
               }
      }
  }
于 2013-09-02T07:10:49.630 に答える
1

ユーザー入力の検証は、テキストボックスやその他のコントロールの横に表示されるツールチップで、これらがフォーカスを失ったときに行う必要があると思います。多くの検証フレームワークがあります。ここで単純な WPF を使用している場合の良い例: http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundation for WPF with MVVM: http://www.codeproject.com/Articles /97564/Attributes-based-Validation-in-a-WPF-MVVM-Applicat for Win フォームは、この http://www.codeproject.com/Articles/10093/Validators-for-Windows-Forms-ValidationProvider-Coを参照してください。

于 2013-09-02T07:29:41.180 に答える
0

必要なフィールドが入力されるまで「OK」をクリックできないようにする方法が望ましいのですが、これが単にコードを「きれいにする」、つまりネストを減らすという要求である場合は、事前に条件を確認できます。

if (string.IsNullOrEmpty(tbVendorName.Text)) 
{
    MessageBox.Show("Vendor name is required");
    return;
}
if (string.IsNullOrEmpty(rtbVendorAddress.Text)) 
{
    MessageBox.Show("Vendor address is required");
    return;
}
if (string.IsNullOrEmpty(tbVendorEmail.Text)) 
{
    MessageBox.Show("Vendor email is required");
    return;
}
if (string.IsNullOrEmpty(tbVendorWebsite.Text)) 
{
    MessageBox.Show("Vendor Website Required");
    return;
}

VendorName = tbVendorName.Text;          
VendorAddress = rtbVendorAddress.Text;
VendorEmail = tbVendorEmail.Text;
VendorWebsite = tbVendorWebsite.Text;

余談ですが、現在は空白のみを許可しているため (形式についても何らかの検証を行っていません)、使用した方がよいでしょう。String.IsNullOrWhitespace()

于 2013-09-02T07:06:34.080 に答える
0

必須フィールドバリデーターと正規表現バリデーターを使用するだけで、大量の JavaScript を作成する必要がなくなります。グーグルだけであなたの人生はずっと簡単になりますrequired field validator

于 2013-09-02T07:09:46.810 に答える
0

IsNullOrEmpty で値を検証し、VendorName、VendorWebsite などを設定したり、エラー メッセージを表示したりする一般的な関数を作成できます。

于 2013-09-02T07:10:56.377 に答える