C# 在表单之间传递值(winforms)

C# 在表单之间传递值(winforms),c#,winforms,.net-3.5,C#,Winforms,.net 3.5,向第二个表单传递值和从第二个表单传递值时的Wierd行为 ParameterForm pf = new ParameterForm(testString); 工作 没有(testString定义为公共字符串) 也许我错过了什么?无论如何,我想让第二个变量正常工作,就像现在一样-它返回空对象引用错误 谢谢你的帮助 在此发布更多代码: 召唤 Button ParametersButton = new Button(); ParametersButton.Click += delegate

向第二个表单传递值和从第二个表单传递值时的Wierd行为

ParameterForm pf = new ParameterForm(testString);
工作

没有(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);
        }
     }
结果: 提交-空对象引用
test-null对象引用

当您想使用第二个变量时,必须使用getString()-方法,在该方法中可以放置例如“testString”的值。按照您编写它的方式,“testString”应该是一个方法(并带有括号)

编辑(更精确一点):

你可以写:

pf.getString(testString);
,如果“pf”是您自己类的实例,否则您必须查找,是否可以检索该类中的字符串。

  • pf.ShowDialog(这个)
    是一个阻塞调用,因此
    pf.Submit+=new ParameterForm.ParameterSubmitResult(pf_Submit)从未到达:切换顺序

  • Submit(这个,这个.node)抛出空对象引用,因为没有为其分配任何事件(请参见上文)。通常,您应该首先检查:
    if(Submit!=null)Submit(this,this.node)

  • 您应该更改``pf.ShowDialog(this)<代码>到pf.Show(这个);`这样,当对话框打开时,主窗体不会被禁用(如果您需要的话),或者使用下面的模型(典型的对话框)


我不确定pfu 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()
    }
 }

事情按顺序进行:)

应该早就设定好了

   pf.ShowDialog(this);
我的错误是在显示第二个表单后可以传递参数


thnx for answers

我可以看看您使用的构造函数吗?它是如何工作的,什么时候出现空对象引用错误?据您所知,testString是一个没有明显原因的首字母小写的属性。如果OP遵循Microsoft的命名约定(不是很好),那么它可能是一个公共字段。“定义为公共字符串“似乎暗示它不是一个属性。我假设窗体与其他类相同,因此它只对标准和某人的眼睛有影响:)是的,窗体与其他类一样,但与其他类一样,有一些命名约定,使其他人更容易查看您的代码,和封装原则,以防止对象在您不知情的情况下被更改(除其他事项外)。您应该研究这两个方面-它使您的代码更加专业,并帮助那些试图帮助您的人(如我们)!如果你的问题已经解决,你一般应该接受这个答案,而不是把它当作你自己的答案别担心。很高兴我能帮忙!我也是,我喜欢这样的地方,即使没有我需要的答案,它也会推进解决方案:)
pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit);
pf.Test = "test";
   pf.ShowDialog(this);