如何通过点击确定哪个表格被带到前面?

时间:2012-11-25 15:02:00

标签: c# forms

我有一个包含子窗体对象的面板的应用程序。当我点击其中一个表格时,它会带到前面。我想知道现在哪一个在前面...... 我查看了事件列表,但无法找到适合我的目的事件:(

这些方法不起作用:

    protected void OpenedFileForm_Enter(object sender, EventArgs e)
    {
        MessageBox.Show("enter");
    }

    protected void OpenedFileForm_Click(object sender, EventArgs e)
    {
        MessageBox.Show("click");
    }

    protected void OpenedFileForm_Activated(object sender, EventArgs e)
    {
        MessageBox.Show("activated");
    }

    protected void OpenedFileForm_MouseClick(object sender, MouseEventArgs e)
    {
       MessageBox.Show("mouse click");
    }

    protected void OpenedFileForm_Shown(object sender, EventArgs e)
    {
        MessageBox.Show("shown");
    }

enter image description here

        OpenFileDialog openFile1 = new OpenFileDialog();

        openFile1.DefaultExt = "*.txt";
        openFile1.Filter = "TXT Files|*.txt|RTF Files|*.rtf";

        if (openFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
           openFile1.FileName.Length > 0)
        {

            switch (Path.GetExtension(openFile1.FileName))
            {

                case ".txt":
                    txtForm childTXT = new txtForm();
                    this.childForms.Add(childTXT);
                    childTXT.Parent = this.mainPanel;              
                    childTXT.richTextBox1.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText);                                               
                    childTXT.Show();
                    break;
            }


        }

3 个答案:

答案 0 :(得分:1)

您是否尝试过Form.Activated活动?

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.activated(v=vs.80).aspx

编辑:

如果您使用的是MDI应用程序,则可能需要使用MdiChildActivate

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.mdichildactivate.aspx

答案 1 :(得分:1)

此代码仅在将Form.TopLevel属性设置为false时才有效。这使它变成了一个子控件,几乎与UserControl无法区分。

这有很多副作用,因为没有“前面”的概念了。子控件的Z顺序由它们在父控件集合中的位置决定。它会影响它发射的事件,激活和停用永远不会发射。此外,Form类被设计为一个容器控件,它不喜欢把焦点本身。它的子控件获得焦点,Form类没有任何焦点用途。这就是Enter,Click和MouseClick事件不会触发的原因,它们是需要关注的事件。

长话短说,你要做的事情并不能完全成为一种感觉。如果它是严格要修复的Z顺序,那么为MouseDown事件编写一个事件处理程序:

    void OpenedFileForm_MouseDown(object sender, MouseEventArgs e) {
        var frm = (Form)sender;
        frm.BringToFront();
    }

您可以添加frm.Select()以获取要触发的Enter事件,但仅在表单不包含任何可聚焦控件本身时才执行此操作。请注意,有证据表明您未在代码中正确分配事件。已显示的事件触发。将FormBorderStyle设置为None也很重要,标题栏不能再指示激活状态。

答案 2 :(得分:0)

好的,我知道了!谢谢大家帮忙。你给了我一个暗示,考虑我的奇怪的MDI想法的公平性,其中Panel是其他表格的父级。我删除了包含Panel的SplitContainer,只做了标准的MDI应用程序,其中Forms是主Form的MDIChildren。         childTXT.MdiParent = this;