2011-12-21 61 views
0

我在form1中有datagridview。我如何从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为什么访问:S

+1

Form1是否有对Form2的引用?如果不是,可以吗?如果不是,一些其他窗体或对象是否有对Form1和Form2的引用? – Nick 2011-12-21 20:11:41

+0

我该怎么做? – snnlaynnkrdsm 2011-12-21 20:16:05

+0

在我的例子中,我有两种形式。上面的例子来自网络。我如何从form2访问form1中的datagridview:S – snnlaynnkrdsm 2011-12-21 20:16:52

回答

2

在窗体2:

public DataGridView Dgv { get; set; } 

在Form1:

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

在Form2的访问自己的DGV欢迎使用属性。

3

你才能访问其成员需要实际Form参考。 (而这些成员将需要public

打电话只是这样的事情:

Form1.dataGridView 

不会起作用,因为Form1仅仅是一个类型,它不是在内存中实例化对象的引用。这就是你如何参考static成员,这不是这里的情况。 DataGridView是一个实例成员。因此,您需要参考Form1实例。更多的东西一样:

firstForm.dgv 

其中firstFormForm2(或传递到方法作为从Form1参数,其中该参数也只是this等)和dgvForm1公构件的变量而言代表DataGridView

事情是这样的:

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的东西在这里。这是故意的。这只是为了在代码级展示这个概念。这些形式是如何继承的,它们是如何实例化的,它们是如何被记忆的,这是所有另一个问题。

您如何设置取决于您。我不熟悉WinForms开发,但我想有更好的方法来实现这一点。为了确定,我们需要知道为什么Form2需要访问Form1DataGridView。相反,他们应该都可以访问共享的后端资源。也许更像这样的:

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”。如果你是初学者,听起来像是选择公开。

相关问题