2010-06-17 88 views
4

将值传递给第二个窗体并且从第二个窗体传递值时的Wierd行为。在窗体之间传递值(winforms)

ParameterForm pf = new ParameterForm(testString); 

工作

ParameterForm pf = new ParameterForm(); 
pf.testString="test"; 

没有(定义为公共字符串的TestString)

也许我失去了一些东西?无论如何,我想让第二个变体正常工作,就像现在一样 - 它返回空对象引用错误。

感谢您的帮助。

发布更多的代码在这里:

调用

Button ParametersButton = new Button(); 
ParametersButton.Click += delegate 
       { 
        ParameterForm pf = new ParameterForm(doc.GetElementById(ParametersButton.Tag.ToString())); 
        pf.ShowDialog(this); 
        pf.test = "test"; 
        pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit); 
       }; 

定义和使用

public partial class ParameterForm : Form 
    { 
     public string test; 
     public XmlElement node; 
     public delegate void ParameterSubmitResult(object sender, XmlElement e); 
     public event ParameterSubmitResult Submit; 

     public void SubmitButton_Click(object sender, EventArgs e) 
     { 
      Submit(this,this.node); 
      Debug.WriteLine(test); 
     } 
    } 

结果: 提交 - 空对象引用 测试 - 空对象引用

+0

我可以看到您使用的构造函数吗? – 2010-06-17 14:34:27

+0

它是如何不工作,你什么时候得到空对象引用错误? – 2010-06-17 14:43:49

回答

2
  • pf.ShowDialog(this);是一个阻塞调用,因此pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit);从未达到:开关的顺序。

  • Submit(this,this.node);由于未分配事件(参见上文),所以会引发空对象引用。一般来说,你应该总是先检查:if (Submit != null) Submit(this,this.node);

  • 你应该改变``pf.ShowDialog(this); to pf.Show(本);(典型的对话框)`这样你的主要形式没有被禁用,而你的对话框是打开的,如果这就是你想要的东西,或者使用下面的模型


我不确定pf_Submit应该做什么,因此这可能不是您的应用程序中最好的方式,但它是一般的“继续?是/否”问题。

Button ParametersButton = new Button(); 
ParametersButton.Click += delegate 
    { 
     ParameterForm pf = new ParameterForm(testString); 
     pf.ShowDialog(this); // Blocks until user submits 
     // Do whatever pf_Submit did here. 
    }; 

public partial class ParameterForm : Form 
{ 
    public string test;  // Generally, encapsulate these 
    public XmlElement node; // in properties 

    public void SubmitButton_Click(object sender, EventArgs e) 
    { 
     Debug.WriteLine(test); 
     this.Close(); // Returns from ShowDialog() 
    } 
} 
0

当你想用你的第二个变体,您必须使用getString() - Method,您可以在其中放置“的TestString”。你写它的方式,“testString”应该是一个方法(并得到括号)。

EDIT(有点更精确):

你可以写:

pf.getString(testString); 

,如果“PF”是你自己的类的实例,否则你不得不寻找,你是否能在这个类中检索一个字符串。

+0

据你所知,testString是一个没有明显原因的小写第一个字母的属性。 – Powerlord 2010-06-17 14:57:48

+0

如果OP遵循微软的命名约定(不是很好),那么它可能是一个公共领域。 “定义为公共字符串”的 – ErikHeemskerk 2010-06-17 15:01:22

+0

似乎暗示它不是一个属性。 – dlras2 2010-06-17 15:06:59

0

的事情是在网上订购:)

pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit); 

pf.Test = "test"; 

前应

pf.ShowDialog(this); 

我的错误而回想该参数可以通过已经建立第二张表格显示后ayed

thnx for answers

+0

如果你的问题是固定的,你通常应该接受这个答案,而不是把它作为你自己的。 ;-) – dlras2 2010-06-17 15:31:28

+0

有点瞎了:) – dnkira 2010-06-17 15:53:45

+0

不用担心。很高兴我能帮上忙! – dlras2 2010-06-17 16:03:11