从另一个表单访问datagrid

时间:2011-12-21 20:07:51

标签: c#

我在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

3 个答案:

答案 0 :(得分:4)

您需要引用实际的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需要访问Form1的{​​{1}}。相反,它们可能都应该访问共享的后端资源。也许更像是这样的事情:

DataGridView

与往常一样,有很多方法可以做到这一点。但基本思想是,您的前端表单不是相互访问并创建各种交叉依赖,而是访问共享的后端资源,而依赖链只是朝着这个方向流动。

答案 1 :(得分:3)

在Form2中:

public DataGridView Dgv { get; set; }

在Form1中:

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

在Form2中访问自己的Dgv。

答案 2 :(得分:0)

您需要将dataGridView字段/属性设置为“public”或“internal”。如果您是初学者,请选择公开。