【问题标题】:passing values between forms (winforms)在表单之间传递值(winforms)
【发布时间】:2011-03-05 00:05:40
【问题描述】:

将值传入和传出第二种形式时的奇怪行为。

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

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

【问题讨论】:

  • 我可以看看你使用的构造函数吗?
  • 它是怎么不工作的,你什么时候得到空对象引用错误?

标签: c# winforms .net-3.5


【解决方案1】:
  • pf.ShowDialog(this); 是一个阻塞调用,因此永远无法到达pf.Submit += new ParameterForm.ParameterSubmitResult(pf_Submit);:切换顺序。

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

  • 你应该改变 ``pf.ShowDialog(this);topf.Show(this);` 以便在你的对话框打开时你的主窗体不会被禁用,如果这是你想要的,或使用下面的模型(对话框的典型模型。)


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

【讨论】:

    【解决方案2】:

    当您想使用第二个变体时,您必须使用 getString() 方法,您可以在其中放置例如“测试字符串”。你写它的方式,“testString”应该是一个方法(并且有括号)。

    编辑(更精确一点):

    你可以写:

    pf.getString(testString);
    

    ,如果“pf”是你自己的类的一个实例,否则你要查找,是否可以在这个类中检索到一个String。

    【讨论】:

    • 据你所知,testString 是一个没有明显原因的具有小写首字母的属性。
    • 如果 OP 遵循 Microsoft 的命名约定(不是很好),那么它可能是一个公共字段。
    • “定义为公共字符串”似乎暗示它不是一个属性。
    • 我认为 Forms 与其他类相同,所以它只对标准和某人的眼睛很重要 :)
    • 是的,Forms 和其他类一样,但就像其他类一样,有一些命名约定可以让其他人更容易查看您的代码,以及防止您的对象被更改的封装原则在你不知情的情况下(除其他外)。你应该研究这两个 - 它使你的代码更加专业,并帮助那些试图帮助你的人(比如我们)!
    【解决方案3】:

    事情是按顺序排列的:)

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

    pf.Test = "test";
    

    应该在之前设置

       pf.ShowDialog(this);
    

    我的错误是认为可以在显示第二种形式后传递参数

    求解答

    【讨论】:

    • 如果您的问题已得到解决,您通常应该接受该答案,而不是将其添加为您自己的答案。 ;-)
    • 不用担心。很高兴我能帮上忙!
    • 我也是,我喜欢这样的地方,即使没有答案我也需要它推动解决方案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多