【问题标题】:Switching between between main and pop-up form在主窗体和弹出窗体之间切换
【发布时间】:2016-02-06 07:51:27
【问题描述】:

如何在子表单处于活动状态时锁定(并使其看起来褪色)父表单?我试图将子表单置于最顶层,但这只是让它始终可见,我仍然可以编辑父表单。我希望在VS2012,C#中运行子窗体时无法在主窗体上进行操作。这是我用来调用第二种形式的代码...

private void checkButton_Click(object sender, EventArgs e)
{
    Form2 newForm = new Form2(this);
    newForm.Show();
}

【问题讨论】:

  • 这个问题与visual studio有什么关系?在另一个编辑器中会有所不同吗?为什么它没有用 Windowm、XAML 或任何其他相关标签进行标记?
  • 只是为了清楚起见,这就是我正在使用的IDE,
  • 既然这么麻烦,为什么不直接忽略它呢??
  • @TomTom 我们不要在这里发疯。您可以直接编辑问题,看看他是如何成为新用户的。

标签: c# .net winforms


【解决方案1】:

一种非常简单的方法是在子表单上使用ShowDialog() 而不是Show()。这将阻止与主窗体的任何交互。这也是传回结果的一种巧妙方法。当然,还有很多其他方法。

例子:

private void checkButton_Click(object sender, EventArgs e)
{
    Form2 newForm = new Form2(this);
    newForm.ShowDialog();
}

详情请参阅 MSDN:https://msdn.microsoft.com/en-us/library/c7ykbedk(v=vs.110).aspx

【讨论】:

  • 这正是我想要的 B.K.我还想知道我使用的数据是否可以保存/传递回原始表单,甚至是文本文件/数据库?
  • @Sensei 是的,但所有这些都是不同的事情,可以通过不同的方式进行处理。例如,如果您想要返回 ShowDialog() 方法返回的 DialogResult 枚举以外的结果,则可以在弹出表单中创建一个公共方法,例如 ShowDialogWithResults(),它在其中使用 ShowDialog(),然后将结果返回到主窗体。你可以在这里看到可能的实现:stackoverflow.com/questions/3764736/…
【解决方案2】:

只需为当前运行表单添加 Hide(),

 private void checkButton_Click(object sender, EventArgs e)
            {
                Form2 newForm = new Form2(this);
                this.Hide();//hide old form
                newForm.Show();
            }

【讨论】:

  • 我想这会起作用,因为可能出现的唯一问题是每次我终止子表单时,都会创建一个父表单的新实例,所以我最终得到了相同的副本形式。
【解决方案3】:

您可以使用 Form.ShowDialog 创建对话框,该对话框将在父窗体之上打开,并且在您关闭子窗体之前不允许编辑父窗体

private void checkButton_Click(object sender, EventArgs e)
        {
            Form2 newForm = new Form2(this);
            newForm.ShowDialog(this);
        }

【讨论】:

    【解决方案4】:

    您可能想在单独的线程中运行 form2 并设置 topmost = true,form1 将畅通无阻,但 form2 也将运行您想要畅通的任何内容。这是你想要的吗?

    namespace TestModal
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread thrd = new Thread(newwindow);
                thrd.IsBackground = true;
                thrd.Start();
            }
    
            private void newwindow()
            {
                Form2 frm2 = new Form2();
                frm2.TopMost = true;
                frm2.ShowDialog();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多