2017-07-11 15 views
0

ツールボックスメニューの標準のDataGridViewを使用します。原則検証中DRY?

イベントcellEditEndによって、DataGridView内の各セルの検証を行います。それは次のようになります。だから、

private void dataGrid_CellEditEnding(object sender,DataGridCellEditEndingEventArgs e) 
{ 
    // Below I demonstrate pseudo code for brevity 

    if(cell.name.value is not Number){ 
     print "Wrong cell value"; 
    } 
} 

、別のフォーム(リサイズ)で、私は機能を持っている、というのDataGridView内のExcelファイルと表示され、それをからの輸入データ。

各セルに挿入する前にExcelデータを検証する必要があります。そのためには、イベントCellValidationを使用することができます。しかし、私はdataGrid_CellEditEndingメソッドで使用したのと同じコードを繰り返すことは望ましくありません。

このコードの再発行を避けるにはどうすればよいですか?

+1

検証コードを別の関数に入れず、編集時とExcelからのインポート時の両方で呼び出さなければならない理由はありますか? –

答えて

0

静的ValidationHelperクラスを作成し、その中にすべての検証メソッドを入れ、必要なときにそれらを呼び出す方法について説明します。

あなたが呼び出すことができます
public static class ValidationHelper 
{ 
    public static void ValidateIsNumeric(string value) 
    { 
    if(value is not Number){ 
     print "Wrong cell value"; 
    } 
    } 
} 

private void dataGrid_CellEditEnding(object sender,DataGridCellEditEndingEventArgs e) 
{ 
    ValidationHelper.ValidateIsNumeric(cell.name.value); 
} 
+0

それは素晴らしいですが、検証する必要のあるセルと検証する方法を知る方法を教えてください。 – OPV

+0

私は、各セルがどんなデータ型であるべきかを知っている必要があり、正しいバリデータメソッド(文字列、日付、数字など)に渡すために各セルの行を書き込む必要があるのではないかと心配です。これにより、検証コード自体を複製することができなくなります。 – Steveland83

+0

@OlegPこれがあなたの(元の)質問に答えられたと感じるなら、アップしてください。 – Steveland83

1

をあなたはresponsabilityデザインパターンの連鎖に見てみることができ、あなたのコードが設定可能で、よりオブジェクト指向、このようになりますされます:

public interface IHandler 
    { 
     void Handle(string value); 
    } 

    public abstract class CellRequestTemplate : IHandler 
    { 
     protected readonly IHandler _next; 
     protected CellRequestTemplate(IHandler next) 
     { 
      _next = next ?? throw new ArgumentNullException(nameof(next)); 
     } 

     public abstract void Handle(string value); 
    } 

    public sealed class FirtsRuleForCell : CellRequestTemplate 
    { 
     public FirtsRuleForCell(IHandler next) : base(value, next) { } 
     public override void Handle(string value) 
     { 
      if(value is number) 
      { 
       _next.Handle(value); 
      } 
      else 
      { 
       //print "Wrong cell value"; 
      } 
     } 
    } 

    public sealed class SecondRuleForCell : CellRequestTemplate 
    { 
     public SecondRuleForCell(IHandler next) : base(value, next) { } 
     public override void Handle(string value) 
     { 
      //if some validation 
      //do something 
      //else 
      // 
      _next.Handle(value); 

     } 
    } 

    public sealed class EndOfChain : IHandler 
    { 
     public void Handle(string value) 
     { 
      throw new InvalidOperationException("End of Chaing, cant handle"); 
     } 
    } 

    public interface IHandleCellFactory 
    { 
     IHandler CreateHandler(); 
    } 

    public sealed class Form1GridHandler : IHandleCellFactory 
    { 
     public IHandler CreateHandler() 
     { 
      return new FirtsRuleForCell(new SecondRuleForCell(new EndOfChain())); 
     } 
    } 

    public sealed class Form2GridHandler : IHandleCellFactory 
    { 
     public IHandler CreateHandler() 
     { 
      return new SecondRuleForCell(new EndOfChain()); 
     } 
    } 


    public abstract class ClientCode 
    { 
     private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
     { 
      // Below I demonstrate pseudo code for brevity 
      var valueToHandle = string.Empty; //cell.name.value; 
      var handler = new Form1GridHandler().CreateHandler(); 
      handler.Handle(valueToHandle); 
      //continue with Execution code 
     } 
    } 

デザインパターンの詳細については、look at this link as referenceをご覧ください。 これが役立つことを願っています。