从另一种形式调用变量c#

时间:2011-05-08 14:38:44

标签: c# winforms

我在DataGridView中有一个Form1我正在使用此代码显示另一个名为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
   }
}

如何解决此问题,以便我可以从DataGridView表单操作Generator

感谢。

3 个答案:

答案 0 :(得分:4)

表格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 :(得分:0)

这里发生了一些事情。

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

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

答案 2 :(得分:0)

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

这样您就可以从生成器表单中调用myForm.myDataGridView