2011-12-21 15 views
0

私はdatagridviewをform1に持っています。どうすればform2からdatagridviewにアクセスできますか?別のフォームからのデータグリッドへのアクセス

private void button1_Click(object sender, EventArgs e) 
    { 
      string sql1 = "insert into Car (plate, color, [year], model) values ('"+tplate.Text+"','"+tcolor.Text+"',"+tyear.Text+",'"+tmodel.Text+"')";    
      string sql2 = "select * from Car"; 
      try 
      { 
       int res = CarDatabase.executeOthers(sql1); 
       if(res >0){ 
        DataTable dt = CarDatabase.executeSelect(sql2); 
        mainframe.Dgv.DataSource = dt;     
        MessageBox.Show("New Car is added"); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
    } 

はここmainframe.Dgvは、最初の形式

であるが、私は、なぜそのForm1.dataGridViewのようにアクセスすることはできません:あなたは、そのメンバーにアクセスするために、実際のFormへの参照を必要とするS

+1

Form1にはForm2への参照がありますか?そうでなければ、それはできますか?そうでない場合、他のフォームやオブジェクトはForm1とForm2への参照を持っていますか? – Nick

+0

どうすればいいですか?私の例では – snnlaynnkrdsm

+0

私は2つのforms.In上記のネットからの例があります。 Form2からform1のDataGridviewにアクセスするにはどうすればいいですか: – snnlaynnkrdsm

答えて

2

public DataGridView Dgv { get; set; } 

をForm1に:Form2のアクセスで

Form2 f = new Form2(); 
f.Dgv = mainframe.Dgv; 

独自のDGVのpropety。

3

。 (。そして、それらのメンバーがpublicが必要になります)

ちょうどこのような何かを呼び出す:動作しません

Form1.dataGridView 

Form1がちょうどタイプであるので、それはメモリ内のオブジェクトのインスタンスへの参照ではありません。これはあなたがstaticのメンバーを参照する方法です。ここではそうではありません。 DataGridViewはインスタンスメンバーです。だからForm1のインスタンスへの参照が必要です。以上のようなもの:

firstFormは(引数がちょうど this、等であろう又は Form1から引数としてメソッドに渡さ) Form2に可変である
firstForm.dgv 

dgvForm1上のパブリックメンバでありますDataGridViewを表します。このような

何か:私はここのWinForms多くのものを残し

public class Form1 
{ 
    public DataGridView DGV { get; set; } 

    private void DoSomething() 
    { 
     var anotherForm = new Form2(); 
     anotherForm.DoSomethingElse(this); 
    } 
} 

public class Form2 
{ 
    public void DoSomethingElse(Form1 firstForm) 
    { 
     var data = firstForm.DGV.DataSource; 
    } 
} 

注意。それは意図的です。これはコードレベルでの概念のデモンストレーションです。フォームが継承するもの、インスタンス化される方法、メモリ内での保持方法、それは別の問題です。

これを設定する方法はあなた次第です。私はWinFormsの開発に精通していませんが、これを実現するより良い方法があると思います。しかし、我々はを知る必要があると判断するために、Form2Form1DataGridViewにアクセスする必要があります。代わりに、両方とも共有バックエンドリソースにアクセスする必要があります。たぶんこのような何か:

public class Form1 
{ 
    private DataGridView dgv { get; set; } 

    private void LoadMyData() 
    { 
     dgv.DataSource = GlobalDataSources.SomeDataSource; 
    } 

    private void DoSomething() 
    { 
     var anotherForm = new Form2(); 
     anotherForm.DoSomethingElse(); 
    } 
} 

public class Form2 
{ 
    public void DoSomethingElse() 
    { 
     var data = GlobalDataSources.SomeDataSource; 
    } 
} 

public class GlobalDataSources 
{ 
    private static SomeDataSourceType _someDataSource; 
    public static SomeDataSourceType SomeDataSource 
    { 
     get 
     { 
      if (_someDataSource == null) 
      { 
       // populate the data source 
      } 
      return _someDataSource; 
     } 
    } 
} 

いつも通り、それを行う方法はたくさんあります。しかし、基本的なアイデアは、お互いにアクセスしてあらゆる種類の相互依存関係を作成するのではなく、フロントエンドのフォームが共有のバックエンドリソースにアクセスし、依存関係がその一方向に流れることです。

0

dataGridViewのフィールド/プロパティを "public"または "internal"にする必要があります。初心者の方はパブリックを選択してください。 Form2ので

関連する問題