سؤال

لدي عرض توضيحي صغير أدناه لمشكلة غريبة.

using System;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public class TestForm : Form
    {
        private System.Windows.Forms.TabControl tabControl1;
        private System.Windows.Forms.TabPage tabPage1;
        private System.Windows.Forms.TabPage tabPage2;
        private System.Windows.Forms.TextBox textBox1;

        public TestForm()
        {
            //Controls
            this.tabControl1 = new System.Windows.Forms.TabControl();
            this.tabPage1 = new System.Windows.Forms.TabPage();
            this.tabPage2 = new System.Windows.Forms.TabPage();
            this.textBox1 = new System.Windows.Forms.TextBox();

            // tabControl1
            this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.tabControl1.Controls.Add(this.tabPage1);
            this.tabControl1.Controls.Add(this.tabPage2);
            this.tabControl1.Location = new System.Drawing.Point(12, 12);
            this.tabControl1.Name = "tabControl1";
            this.tabControl1.SelectedIndex = 0;
            this.tabControl1.Size = new System.Drawing.Size(260, 240);
            this.tabControl1.TabIndex = 0;
            this.tabControl1.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControl1_Selected);

            // tabPage1
            this.tabPage1.Controls.Add(this.textBox1);
            this.tabPage1.Location = new System.Drawing.Point(4, 22);
            this.tabPage1.Name = "tabPage1";
            this.tabPage1.Size = new System.Drawing.Size(252, 214);
            this.tabPage1.TabIndex = 0;
            this.tabPage1.Text = "tabPage1";

            // tabPage2
            this.tabPage2.Location = new System.Drawing.Point(4, 22);
            this.tabPage2.Name = "tabPage2";
            this.tabPage2.Size = new System.Drawing.Size(192, 74);
            this.tabPage2.TabIndex = 1;
            this.tabPage2.Text = "tabPage2";

            // textBox1
            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox1.Location = new System.Drawing.Point(6, 38);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(240, 20);
            this.textBox1.TabIndex = 0;

            // TestForm
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.Controls.Add(this.tabControl1);
            this.Name = "Form1";
            this.Text = "Form1";
        }

        //Tab Selected
        private void tabControl1_Selected(object sender, EventArgs e)
        {
            this.Text = "TextBox Width: " + this.textBox1.Width.ToString();
        }
    }

    //Main
    static class Program
    {
        static void Main()
        {
            Application.Run(new TestForm());
        }
    }

}

إذا قمت بتشغيل كود C# أعلاه، سيكون لديك نموذج صغير يحتوي على عنصر التحكم في علامة التبويب.يوجد داخل عنصر التحكم في علامة التبويب مربع نص في علامة التبويب الأولى.إذا اتبعت هذه الخطوات سترى المشكلة:

  1. حدد tabPage2 (يتم الإبلاغ عن عرض textBox1 في عنوان النموذج)
  2. تغيير حجم النموذج
  3. حدد tabPage1 (تم الإبلاغ عن عرض textBox1 الخاطئ)

أي أفكار ما يجري هنا؟من الواضح أن مربع النص أكبر مما يتم الإبلاغ عنه.إذا قمت بالنقر مرة أخرى على tabPage2، فسيتم تحديث الحجم الصحيح.من الواضح أن هناك حدثًا يقوم بتحديث عرض textBox1.هل يمكنني تشغيل هذا عند تحديد tabPage1؟

هل كانت مفيدة؟

المحلول

أولاً، شكرًا على البرنامج الكامل - لقد نجح كثيراً من الأسهل معرفة ما كان يحدث!

بينما لا يكون مربع النص مرئيًا، لا يتم تغيير حجمه.عند تحديد tabPage1، يتم تشغيل الحدث المحدد قبل تصبح عناصر التحكم مرئية ويتم تخطيط مربع النص مرة أخرى.

الآن، هذا هو سبب حدوث ذلك - ولكن ما هو وضعك الحقيقي؟إذا كنت تريد بالفعل التقاط حجم عناصر التحكم المتغيرة، فاشترك في أحداث تغيير الحجم الخاصة بها.إذا لم يكن الأمر كذلك، هل يمكنك شرح المزيد حول ما تحاول تحقيقه؟

نصائح أخرى

أنا متأكد من أن ما يحدث هو Selected يتم رفع الحدث قليلاً قبل أن تصبح صفحة علامة التبويب مرئية.لا يتم تغيير حجم مربع النص حتى تصبح صفحة علامة التبويب مرئية، لذلك ينتهي بك الأمر إلى التحقق من قيمة حجم مربع النص قبل تغيير حجمه فعليًا.عند تغيير علامات التبويب مرة أخرى، يتم تغيير حجم مربع النص بالفعل، بحيث تحصل على القيمة الصحيحة.

قم بتغيير الأسطر القليلة الأخيرة من نموذج المثال الخاص بك لتبدو بهذا الشكل وسيصبح واضحًا:

            this.textBox1.SizeChanged += TextboxSizeChanged;
        }

        //Tab Selected
        private void tabControl1_Selected(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("tab selected");
            this.Text = "TextBox Width: " + this.textBox1.Width.ToString();
        }

        private void TextboxSizeChanged(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("Textbox resized");
        }

إذا قمت بتعديل التعليمات البرمجية الخاصة بك قليلاً عن طريق إضافة معالج حدث إلى الحدث textbox1.Resize سترى ما سيحدث.يقع الحدث tabPage1.Selected قبل تغيير حجم عناصر التحكم في صفحة علامة التبويب، لذا عندما تتحقق من عرض مربع النص، فإنك تتحقق منه قبل تغيير حجمه.

في العادة لن يكون هذا مشكلة، لأن تغيير الحجم يتم بشكل صحيح بعد ذلك، ولكن أعتقد أنك ستستخدم حجم مربع النص لشيء ما؟

يجب أن تكون قادرًا على كتابة TabControl الخاص بك والذي يعمل على حل هذه المشكلة، ولكن سيتعين عليك التجربة لمعرفة ما الذي يعمل هنا.

لست متأكدا إذا كنت أفهم المشكلة.ولكن، يمكنك استخدام حدث تغيير الحجم الخاص بمربع النص لالتقاط تغيير العرض أو تغيير حجم النموذج.

في المثال الخاص بك، هل يتم إطلاق حدث تحديد tabPage1 عند تنفيذ الخطوة 3؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top