从另一个表单调用方法

时间:2014-12-28 14:07:39

标签: c# methods invoke

我正在尝试编写一个可以显示sql数据库的程序。我有2个表单,我想调用可显示的方法(在主窗体(Form1)上为Form1上的每个选定的表打开一个新的tabpage)。这两个窗体同时打开,第二个窗体应该在调用displaytable方法后关闭(From2)。

Form1中:

 
  private void openDatabaseToolStripMenuItem1_Click(object sender, EventArgs e)//File/Database/Open Database
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                data = openFileDialog1.FileName;
            }
            cn = "Provider=Microsoft.JET.OLEDB.4.0; Data Source =" + data;
            try
            {
                connection = new OleDbConnection(cn);
                connection.Open();
                Form2 DataSelect = new Form2();
                DataSelect.Show();
            }
            catch (Exception exceptcion)
            {
                MessageBox.Show("Such Error! Very Problem: "+exceptcion);
            }
        }
public void displaytable() // displays selected table on new tabpage (and dgv) { for (int i = 0; i < Form2.selectedtabscount; i++) { string a = database.ElementAt(i); TabPage page = new TabPage(a); tabControl1.TabPages.Add(page); }

    }

Fomr2(不起作用): }

我不知道如何在Form1上调用displaytable方法。

3 个答案:

答案 0 :(得分:1)

Form1.displaytable();不起作用,因为displaytable是一种实例方法。请记住,Form1是一个类,即类型。你无法在Form1类型上调用它,而是必须在它的实例上调用它。

您可以通过构造函数注入将Form1的实例传递给Form2。将参数添加到Form2

的构造函数中
private Form1 _form1;

public Form2(Form1 form1)
{
    InitializeComponent();
    _form1 = form1;
}

private void bt_select_Click(object sender, EventArgs e)
{
    selectedtabscount = checkedListBox1.CheckedItems.Count;
    _form1.displaytable();
    this.Close();
}

Form1中,您可以像这样创建Form2的实例:

Form2 DataSelect = new Form2(this);

Form1使用Form2关键字将其当前实例传递给this


我还注意到Form2.selectedtabscount存在同样的问题。如果您向方法displaytable

添加参数,那将更有意义
public void displaytable(int selectedtabscount) 
{
    for (int i = 0; i < selectedtabscount; i++) {
        ...
    }
}

然后像这样调用它:

    _form1.displaytable(checkedListBox1.CheckedItems.Count);

答案 1 :(得分:0)

您只是在创建Form1的新实例。您没有展示它,您需要致电form1.Show ()form1.ShowDialog()以显示其他表单。

答案 2 :(得分:0)

这个问题与此问题几乎相同:I need to access a form control from another class (C#)

您有两种选择:

  • 将表单从Form1传递到Form2,并在bt_select_Click方法
  • 中使用它
  • 或(更好的一个):在Form2中定义一个事件并从Form1订阅它(使用this sample