从另一种形式访问数据网格

本文关键字:数据 数据网 网格 访问 另一种 | 更新日期: 2023-09-27 18:18:27

我有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());
            }
  }

大型机。Dgv是第一种形式

,但我不能像那样访问。dataGridView原因:S

从另一种形式访问数据网格

In Form2:

public DataGridView Dgv { get; set; }
在Form1:

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

在Form2中访问自己的Dgv属性

为了访问其成员,您需要对实际Form的引用。(这些成员必须是public)

就像这样调用:

Form1.dataGridView

不会工作,因为Form1只是一个类型,它不是对内存中实例化对象的引用。这就是你引用static成员的方式,这不是这里的情况。DataGridView是一个实例成员。因此需要引用Form1实例。更像是:

firstForm.dgv

,其中firstFormForm2上的一个变量(或者作为Form1的参数传递给this等),dgvForm1上的public成员,代表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;
        }
    }
}
像往常一样,有很多方法可以做到这一点。但基本的想法是,你的前端表单访问共享的后端资源,而不是相互访问和创建各种交叉依赖,依赖链只是在一个方向上流动。

您需要使dataGridView字段/属性为"public"或"internal"。如果你是初学者,就选择public。