当 TopLevel = false 时,文本控件不允许用鼠标选择文本

编程


大家好!

我的表单中的文本框有问题。

截图如图http://rghost.ru/5011999/image.png

让我们用一个简单的例子来展示这种情况。

1)用Form1新建一个winforms项目;
2)新建一个Form2,放入TextBox控件;
3)让我们编写简单的代码来创建非模态形式;

中度语言
Form frm = new Form();
frm.StartPosition = FormStartPosition.CenterParent;
frm.TopLevel = false; // here is the problem
frm.Parent = this;
frm.Show();
frm.BringToFront();

执行此代码后,将出现带有文本框的表单。
在文本框中输入一些内容,例如“这是一个测试”。 现在,尝试用鼠标选择部分或整个文本 – 你不能,因为它不起作用。

是的,您可以通过双击选择整个文本,但之后您无法取消选择它。 此外,如果您只需要选择文本的一部分来删除它怎么办?!

当表单是模态的时,一切工作正常。

备忘录的情况相同,我想其他一些文本控件也是如此。

我需要所有这些,因为我们使用严肃的 MDI 项目,并且在每个 MDI 表单中用户可以打开不同的表单(例如搜索表单)。 当然,我们可以将它们设为模态,但从那时起这将不是真正的 MDI。

请问有什么建议吗?

解决方案3

代替 ParentMdiParent:

Form2 frm = new Form2();
frm.StartPosition = FormStartPosition.CenterParent;
frm.TopLevel = false;
frm.MdiParent = this;
frm.Show();
frm.BringToFront();

并确保您的主表单有 IsMdiContainer 设置为 true。

—————-

不要因为您没有正确解释您的问题而责怪我们:
如果我从你的评论中很好地理解你有3种形式:
1- MainFormIsMdiContainer 设置为真
2- ChildFormMdiParent 设置 MainForm

3- AnotherChildForm。 你希望这个成为以下的孩子 ChildForm

如果这是正确的,那么您就无法消除该错误。 删除错误 ChildForm 应该 两个都 MdiContainer MdiChild 这是不可能的。 您必须使第三种形式成为 MainForm,或者不使用表格(也许是 UserControl 或者其他的东西)。

解决方案1

首先,您想通过设置来实现什么目的 TopLevelfalse? 你为什么打电话来 BringToFront()? 当您创建无模式表单时,它会自动显示(它被带到前面)。

其次,听起来您不太了解 MDI 应用程序的本质,也不太了解子窗口与其他窗体之间的相互关系。

第三,如果您要创建一个无模式窗口,应该这样做:

C#
public partial class MyForm
{
    MyModelessForm m_modelessForm = null;

    private void ShowModelessForm()
    {
        if (m_modelessForm == null)
        {
            m_modelessForm = new ModelessForm();
            // configure the form here if necessary
        }
        m_modelessForm.Show();
        m_modelessForm.BringToFront();
    }
}

解决方案2

假设您设置了属性 IsMdiContainer 的 Form1 如果为真,您的代码应如下所示:

Form2 frm2 = new Form2();
frm2.MdiParent = this;
frm2.Show();

解决方案4

尝试将子窗体的 FormBorderStyle 属性设置为“none”

コメント

タイトルとURLをコピーしました