لا تسمح عناصر التحكم في النص بتحديد النص باستخدام الماوس عندما يكون TopLevel = false

برمجة


أهلاً بكم!

لدي مشكلة مع TextBoxes في النموذج الخاص بي.

لقطة الشاشة كصورة http://rghost.ru/5011999/image.png

دعونا نعرض الوضع على مثال بسيط.

1) إنشاء مشروع winforms جديد باستخدام Form1؛
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

يستبدل Parent مع MdiParent:

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

وتأكد من أن النموذج الرئيسي الخاص بك موجود IsMdiContainer تم ضبطه على صحيح.

—————

لا تلومنا لأنك لم تشرح مشكلتك بشكل صحيح:
إذا فهمت جيدا من تعليقاتك فلديك 3 أشكال:
1- MainForm مع IsMdiContainer تم ضبطه على صحيح
2- ChildForm مع MdiParent ضبط ل MainForm

3- AnotherChildForm. وتريد أن يكون هذا الطفل طفلاً ChildForm.

إذا كان هذا صحيحا، فلن تتمكن من التخلص من الخطأ. لإزالة الخلل ChildForm يجب ان يكون كلاهما MdiContainer و MdiChild وهذا غير ممكن. يجب عليك إما أن تجعل النموذج الثالث طفلاً MainForm، أو لا تستخدم نموذجًا (ربما a UserControl أو شيء ما).

الحل 1

أولاً، ما الذي تحاول تحقيقه من خلال الإعداد TopLevel ل false؟ ولماذا تتصل BringToFront()؟ عندما تقوم بإنشاء نموذج غير مشروط، فإنه يظهر تلقائيًا (يتم إحضاره إلى المقدمة).

ثانيًا، يبدو أنك لا تفهم تمامًا طبيعة تطبيق MDI، ولا العلاقة المتبادلة بين النوافذ الفرعية والأشكال الأخرى.

ثالثًا، إذا كنت تقوم بإنشاء نافذة غير مشروطة، فيجب أن يتم ذلك على النحو التالي:

ج#
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

على افتراض أنك قمت بتعيين الخاصية IsMdiContaineص من Form1 إلى صحيح، يجب أن يقرأ الكود الخاص بك مثل هذا:

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

الحل 4

حاول تعيين خاصية FormBorderStyle للنموذج الفرعي على “لا شيء”

コメント

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