我只能将静态函数从表单调用到另一个表单吗?

时间:2011-11-20 16:19:15

标签: c#

我有2个表单连接到数据库,LoadDocument表单和Fom1是主要表单。在LoadDocument我从我的数据库中获取文档名称,当我关闭LoadDocument时,我将文档ID发送到Form1,以便我可以在那里检索其内容。

唯一的问题是,如果我在Form1中创建了一个函数,名为public void showContent()我的LoadDocument无法调用它,因为它不是静态的,如果我将其设为静态,我在创建radioButtons时遇到问题。

public partial class Form1 : Form
{
    public void showTasks()
    {
        radioButtons = new RadioButton[numberOfTasks];
        for (int i = 0; i < numberOfTasks; ++i)
        {
            radioButtons[i] = new RadioButton();
            radioButtons[i].Text = "Task " + (i+1);
            radioButtons[i].Location = new System.Drawing.Point(
                10, 10 + i * 20);
            groupBox1.Controls.Add(radioButtons[i]);
            radioButtons[i].Click += new EventHandler(this.radioButtons_Click);
        }
    }
}

有没有办法可以从LoadDocument调用此函数而不使其静态?我是否必须使LoadDocument动态,在这种情况下如何?

编辑:我想这段代码非常相关:

    private LoadDocument m_form1;
    private bool m_underConstruction = false;
    private void ShowLoadDocument()
    {
        if (m_underConstruction)
        {
            // We're about to show it anyway
            return;
        }
        m_underConstruction = true;
        try
        {
            if (m_form1 == null)
            {
                m_form1 = new LoadDocument();
                // m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
                m_form1.Show();
            }
        }
        finally
        {
            m_underConstruction = false;
        }
        m_form1.BringToFront();
        m_form1.Activate();
    }

3 个答案:

答案 0 :(得分:2)

我不确定控件流和两个表单的共存,但您可以将Form1的实例传递给LoadDocument并直接在该对象上调用该方法。像:

public class LoadDocument : Form {

    private Form1 form1;
    public LoadDocument(Form1 form1) {
        this.form1 = form1;
    }

    // later

    public void Method() {
        form1.showTasks();
    }
}


public class Form1 : Form {

     public void SomeMethod() {              
        LoadDocument doc = new LoadDocument(this);
        doc.Show();
     }
}

答案 1 :(得分:0)

您可以在showContent

的实例上调用Form1方法

我了解LoadDocument表单是从Form1创建的。将Form1的实例传递给LoadDocument构造函数。这样,您就可以form1WhoCreatedMe.ShowContent()中的某个地方LoadDocument。{/ p>

dynamic关键字对您没有帮助。与static相反,dynamic

答案 2 :(得分:0)

您不需要将其设为静态,但您需要引用Form1来调用它。您可以在创建时将此引用传递给LoadDocument的构造函数:

public class Form1 : Form
{
    ...

        LoadDocument loadDocument = new LoadDocument(this);
        loadDocument.ShowDialog();

    ...
}

public class LoadDocument : Form
{
    private readonly Form1 _form1;

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

    ...


         _form1.showTasks();

    ...
}