【问题标题】:Handling data between multiple Forms处理多个表单之间的数据
【发布时间】:2013-08-07 18:50:24
【问题描述】:

我正在开发一个生成 PDF 文件的程序。在最终生成文件之前,我想让用户选择编辑文件的一部分(即将创建的图形的标题)。当用户单击按钮导出 PDF 时,我希望它以新形式显示。这是我正在尝试做的事情的大纲......

private void button4_Click(object sender, EventArgs e) // Test PDF Code!
{
    Form2 NewPDF = new Form2(chart3.Titles[chart3.Titles.IndexOf("Header")].Text.ToString().Substring(0, chart3.Titles[chart3.Titles.IndexOf("Header")].Text.ToString().Length - 4));
    NewPDF.Show(); 

    if (NewPDF.Selected == true)
    {
       // Create PDF, open save file dialog, etc             
    }
}

这是单击此按钮打开的表单...

public partial class Form2 : Form
{

    public bool Selected
    {
        get;
        set;
    }

    public String GraphName
    {
        get;
        set;
    }


    public Form2(String FileName)
    {
        InitializeComponent();
        textBox1.Text = FileName;
        GraphName = FileName;
        Selected = false;
    }

   public void button1_Click(object sender, EventArgs e)
    {
        GraphName = textBox1.Text;
        this.Selected = true; // After the button is selected I want the code written above to continue execution, however it does not!
    }
}

截至目前,当我点击Form2中的按钮时,没有任何反应,两个Form之间的通信有一些我不理解的东西!

【问题讨论】:

标签: c# .net windows winforms


【解决方案1】:

你应该像下面这样改变你的Form2.GraphName

public String GraphName
{
    get { return textBox1.Text }
}

然后像下面这样更改您的新 Form2 创建,测试它,因为我没有通过 VS 运行它,但应该可以工作:)

private void button4_Click(object sender, EventArgs e) // Test PDF Code!
{
    // why on earth were you doing .Text.ToString()?  it's already string...
    Form2 NewPDF = new Form2(chart3.Titles[chart3.Titles.IndexOf("Header")].Text.Substring(0, chart3.Titles[chart3.Titles.IndexOf("Header")].Text.Length - 4));

    // show as a dialog form, so it will wait for it to exit, and set this form as parent
    NewPDF.ShowDialog(this); 

    if (NewPDF.Selected == true)
    {
        // get the name from the other form
        string fileName = NewPDF.GraphName;

       // Create PDF, open save file dialog, etc
    }
}

【讨论】:

    【解决方案2】:

    你的问题的答案很简单。

    NewPDF.Show();
    

    Show() 不会暂停调用表单的执行。因此,验证 Selected 属性是否为 true 的检查将永远不会正确执行,因为该检查在表单开始出现时就已到达并验证。 ShowDialog() 会暂停执行并等待被调用的表单关闭。

    除此之外;我会推荐其他两种在表单之间进行通信的方式之一;

    1. 使用全局变量。在公共模块中的某处声明一个保存图形名称的变量。使用 ShowDialog() 调用要求用户输入名称的对话框,因为这会暂停调用表单的执行,直到被调用的表单返回结果。

      if(Form.ShowDialog() == DialogResult.OK) {
        // Save pdf, using title in global variable
      }
      

      确保在 Close() 之前在调用的表单中设置 DialogResult。

    2. 将调用表单的实例变量传递给被调用的名称输入表单到构造函数并保存。这样,如果您将图形名称属性公开为公共属性,您应该能够从关闭表单的代码中调用的表单访问它,这是您的:

         public void button1_Click(object sender, EventArgs e)
         {
             callingFormInstance.GraphNameProperty = textBox1.Text;
             Close();
         }
      

    希望对您有所帮助。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2011-09-04
      相关资源
      最近更新 更多