从另一种forms调用变量c#

我在Form1有一个DataGridView ,我正在使用此代码显示另一个名为Generator表单:

 private void button1_Click(object sender, EventArgs e) { Form gen = new Generator(); // Form gen = new Generator(Form this); //* I tried this but is not working *// gen.Show(); } 

Generator表单中,我需要读取或修改Form1 datagridview中的内容。

 public partial class Generator : Form { public Form myForm; public Generator() { InitializeComponent(); } public Generator(Form frm) { myForm = frm; } private void button1_Click(object sender, EventArgs e) { myForm.mydatagridview.! // this is not working } } 

我该如何解决这个问题,所以我可以从Generator表单中操作DataGridView

谢谢。

表格1:

 private void button1_Click(object sender, EventArgs e) { Form gen = new Generator(this.mydatagridview); gen.Show(); } 

发电机表格:

 DataGridView _dataGridView; public Generator(DataGridView dataGridView) { InitializeComponent(); this._dataGridView = dataGridView; } private void button1_Click(object sender, EventArgs e) { this._dataGridView...! // this will work } 

你必须做的事情,并且知道(只是提示,你不是被迫做这些,但我相信如果你这样做,你会成为一个更好的程序员!)

始终在所有表单构造函数中调用InitializeComponent()。 在您的示例中,您没有在其中一个构造函数中调用它。

C#只知道您传递的类型的信息。 如果您传递一个表单,那么您只获得表单属性(即表单类型的属性),而不是您自己的表单的属性。

尝试封装东西。 不要将整个表单传递给另一个表单。 相反,传递您想要在另一个表单上使用的内容。

这里发生了一些事情。

  1. 您必须使用Generator的构造函数,该构造函数将表单作为参数。
  2. 您必须将datagridview公开为将传递给Generator的表单上的公共或内部属性。
  3. 普通的Form类不会知道这个属性,所以你应该适当地转换变量。
  4. 当使用其他构造函数确保所有内容都已正确初始化时,您应该调用Generator的默认构造函数。 请参阅下面的代码示例

像这样的东西应该工作:

 public class Generator { private MyForm myForm; public Generator() { InitializeComponent(); } public Generator(MyForm frm) : this() // DON'T FORGET THIS() { myForm = frm; } private void button1_Click(object sender, EventArgs e) { myForm.MyDataGridView... // Yay, it works! } } public class MyForm : Form { public MyForm() { InitializeComponent(); // a datagridview is created here, say "datagridview1" } public DataGridView MyDataGridView { get { return datagridview1; } } } 

然后在你的按钮点击事件(我假设在MyForm某个地方定义):

 private void button1_Click(object sender, EventArgs e) { Form gen = new Generator(this); gen.Show(); } 

最简单的方法是在Form1上打开DataGridView(myDataGridView)的设计器,并将Modifiers属性从privateinternalpublic

这将允许您从Generator表单中调用myForm.myDataGridView