从另一个表单访问datagrid
我在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是第一种forms
但我无法访问Form1.dataGridView为什么:S
在Form2中:
public DataGridView Dgv { get; set; }
在Form1中:
Form2 f = new Form2(); f.Dgv = mainframe.Dgv;
在Form2中访问自己的Dgv propety。
您需要引用实际的Form
才能访问其成员。 (这些成员需要public
。)
只是调用这样的东西:
Form1.dataGridView
因为Form1
只是一个类型,它不会工作,它不是对内存中实例化对象的引用。 这就是你引用static
成员的方式,这不是这里的情况。 DataGridView
是一个实例成员。 所以你需要一个Form1
实例的引用。 更像是:
firstForm.dgv
其中firstForm
是Form2
上的变量(或者作为Form1
中的参数传递给方法,其中参数只是this
,等等),而dgv
是Form1
上表示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的东西。 那是故意的。 这只是为了在代码级别演示该概念。 这些forms的inheritance,它们如何被实例化,它们如何被记忆,这是另一个问题。
你如何设置它取决于你。 我不太熟悉WinForms开发,但我想有更好的方法来实现这一点。 但是,为了确定这一点,我们需要知道为什么 Form2
需要访问Form1
的DataGridView
。 相反,它们可能都应该访问共享的后端资源。 也许更像是这样的东西:
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”。 如果您是初学者,请选择公开。