2017-08-29 6 views
3

を渡すとき、私はいくつかの詳細を処理し、メインフォームを更新するために、新しいフォームにパブリック関数を渡すしようとしているが、このことについて、この面白いが、それが起こるdoesntのあるeh.TextBox1.Text = dt.Columns[e.ColumnIndex].ToString();とNullReferenceExceptionアクション

このライン上とNullReferenceExceptionを取得イアいますここで>EditHeader eh = new EditHeader(this.UpdateHeader);

Form1の

に関連するコードです - 私は、デリゲート(左手側)コードdoesntのクラッシュ(しかし、明らかにdoesntの仕事)

EditHeader eh = new EditHeader();を取る場合はそれまでは、私は、デリゲートを含めます0

private void OnColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { 
      EditHeader eh = new EditHeader(this.UpdateHeader); 
      eh.TextBox1.Text = dt.Columns[e.ColumnIndex].ToString(); 
      eh.TextBox2.Text = e.ColumnIndex.ToString(); 
      eh.Show(); 
     } 

     private void UpdateHeader(string indexVal) { 
      string[] array = indexVal.Split(','); 
      int index = int.Parse(array[0]); 
      dt.Columns[index].ColumnName = array[1]; 
     } 

そしてここEditHeader(またはフォーム2)である

private readonly Action<string> _UpdateHeader; 

     public EditHeader() { 
      InitializeComponent(); 
     } 

     private void EditHeader_Load(object sender, EventArgs e) { 

     } 

     public EditHeader(Action<string> updateHeader) { 
      _UpdateHeader = updateHeader; 
     } 

     public TextBox TextBox1 { 
      get { 
       return textBox1; 
      } 
      set { 

      } 
     } 

     public TextBox TextBox2 { 
      get { 
       return textBox2; 
      } 
      set { 

      } 
     } 

     private void button1_Click(object sender, EventArgs e) { 
      int index = int.Parse(textBox2.Text); 
      string indexVal = index.ToString() + "," + textBox1.Text; 
      _UpdateHeader(indexVal); 
      this.Close(); 
     } 

答えて

3

のみゼロ引数コンストラクタは、コンポーネントの初期化されています。アクションを渡すコンストラクタを呼び出すと、コンポーネントは初期化されないので、eh.TextBox1はnullです。

":this()"を含む基本呼び出しリストをコンストラクタの定義に追加すると、アクションargコンストラクタの本体が終了した後に、ゼロ引数のコンストラクタを呼び出すことができます。

2

InitializeComponentが呼び出されていません。

public EditHeader(Action<string> updateHeader) 
    : this() 
{ 
    _UpdateHeader = updateHeader; 
} 

あなたのコンストラクタは次のようになります。