【问题标题】:Windows form application sequential ShowDialog()sWindows 窗体应用程序顺序 ShowDialog()s
【发布时间】:2018-06-06 14:08:44
【问题描述】:

我在关闭对话框表单时遇到了一个有趣的问题。 问题来了:

我以showdialog(); 运行应用程序并打开第二个表单(通过菜单条),然后从第二个表单打开第三个表单。当我通过button 1 打开第三个表单然后关闭它时,一切都很好,但是当我通过button 2 打开第三个表单然后关闭它时,第三个表单将被关闭,然后它也会关闭第二个表单。 !!!在第二种形式中,当我显示 messageBox 并关闭它时,第二种形式也将被关闭。

这是我的代码:

从第一个表单代码打开第二个表单:

private void settingsToolMenu_Click(object sender, EventArgs e)
    {
        settingsForm s1 = new settingsForm(this);
        s1.ShowDialog();
    }

通过button 1 表单代码从第二个表单打开第三个表单:

private void addReportButton_Click(object sender, EventArgs e)
    {
        addReport a1 = new addReport(this);
        a1.ShowDialog();
    }

通过button 2 表单代码从第二个表单打开第三个表单:

private void editReportButton_Click(object sender, EventArgs e)
    {
        addReport a2 = new addReport(this);
        a2.ShowDialog();
    }

如您所见,button 1button 2 之间没有区别

here 是来自应用程序运行的视频。

【问题讨论】:

  • 如果先按button 2再按button 1,会不会同时关闭第二个表单(settingsForm)?
  • 您能出示您的 addReport 表单的代码吗?

标签: c# forms winforms visual-studio showdialog


【解决方案1】:

不确定那里发生了什么,但应该有.Show() 方法,它以不同的方式运行窗口,包括关闭策略。试试看。

【讨论】:

    【解决方案2】:

    试试这个

    代替

    addReport a2 = new addReport(this);
    a2.ShowDialog();
    

    使用

    addReport a2 = new addReport();
    a2.ShowDialog(this);
    

    然后点击对话框窗口的退出/关闭按钮

    private void BtnExit_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
    

    希望这能解决您的问题。

    【讨论】:

    • @mohamadkamal : 您能否分享导致此问题的第三个对话框的代码?
    【解决方案3】:

    我使用了这段代码,它成功了。我有3个表单,第一个表单是在运行应用程序时打开的,第二个表单是用按钮打开的(可以是menustrip,没关系),然后第三个也是这样打开的,关闭第三个表单后第二个表单保持打开状态。

    FormN fm = new FormN();
    fm.ShowDialog();
    

    在通过单击按钮调用的每个方法中使用该代码段,它应该可以正常工作。只需为您的表单命名更改“FormN”即可。此外,如果您需要将任何表单的属性传递给下一个表单,您可以这样做:

    第一种形式的代码:

        public string mytext; //Variable I want to use later, in Form2.
        public Form1()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            mytext = tb1.Text;
            Form2 fm = new Form2(this);
            fm.ShowDialog();
        }
    

    请注意我在调用“fm.ShowDialog();”之前如何将“tb1”的 (TextBox1) 值保存在变量中,以便稍后在 Form2 中使用 TextBox1 值。

    第二个表单的代码,具有主表单的变量(例如“mytext”值)。

        Form1 mfm;
        public Form2(Form1 mainfm)
        {
            InitializeComponent();
            mfm = mainfm;
        }
        public void button2_Click(object sender, EventArgs e)
        {
            //In this method I use the variable "mytext" wich is a Form1 attribute.
            //You can see how I declare it in the first form's code (see above).
            textBox1.Text = mfm.mytext;
        }
    

    有了这个,你已经创建了一个主窗体的对象(“Form1 mfm;”),其中包含在调用第二个窗体之前它包含的所有变量,它也可以用于第三个窗体。

    【讨论】:

      【解决方案4】:

      在第二种形式 formClosing() 事件中我写了这些代码:

      private void settingsForm_FormClosing(object sender, FormClosingEventArgs e)
      {
          if(e.CloseReason != CloseReason.UserClosing)
          {
              e.Cancel = true;
          }
      }
      

      除了用户之外,没有任何东西可以关闭第二个表单!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多