2011-11-20 39 views
0

我有两种形式连接到数据库,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(); 
    } 
+0

在代码中最有趣的部分是调用showTasks()的代码。如果从LoadDocument表单调用Form1的-instance-函数,应该不会有问题,但我想您将其称为Form1的静态方法。 – Boaz

+0

从LoadDocument表单上的按钮调用它 private void btnLoad_Click(object sender,EventArgs e) Form1.activeDocumentId = documentId; // Form1.showTasks(); this.Close(); } – Raptor

+0

问题是你的架构。为什么表单无论如何都会互相干扰对方的内容?你应该更新每种形式反映的某种通用模型。您不应*需要*调用其他表单上的任何方法。 – siride

回答

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

可以调用showContent方法上的Form1一个实例。

据我所知,LoadDocument表格是从Form1创建的。将Form1的实例传递给LoadDocument构造函数。这样,你就可以在LoadDocument的某个地方做form1WhoCreatedMe.ShowContent()

dynamic关键字不会帮到你。 dynamic不是static相反。

+0

如何让我的表单实例? – Raptor

+0

@Raptor:就像**都铎**所写的答案中所表现的那样。 – Otiel

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

    ... 
} 
相关问题