2

以下に、独特の問題の小さなデモを示します。

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# コードを実行すると、タブ コントロールを含む小さなフォームが作成されます。タブ コントロール内の最初のタブに texbox があります。次の手順に従うと、問題が発生します。

  1. tabPage2 を選択します (textBox1 の幅はフォームのタイトルで報告されます)。
  2. フォームのサイズを変更する
  3. tabPage1 を選択します (間違った textBox1 幅が報告されます)

ここで何が起こっているのですか?テキストボックスは、報告されているものよりも明らかに大きいです。tabPage2 をもう一度クリックすると、正しいサイズが更新されます。明らかに、textBox1 の幅を更新するイベントがあります。tabPage1 が選択されたときにこれをトリガーできますか?

4

4 に答える 4

2

まず、完全なプログラムに感謝します。これにより、何が起こっているのかを理解するのがはるかに簡単になりました!

テキスト ボックスは表示されませんが、サイズは変更されません。tabPage1 を選択すると、コントロールが表示される前にSelected イベントが発生し、テキスト ボックスが再び配置されます。

今、それが起こっている理由です - しかし、あなたの本当の状況は何ですか? コントロールのサイズ変更を実際にキャプチャしたい場合は、それらの Resize イベントをサブスクライブします。そうでない場合は、達成しようとしていることについて詳しく説明していただけますか?

于 2008-10-22T20:57:26.893 に答える
1

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");
        }
于 2008-10-22T20:58:45.987 に答える
1

イベント ハンドラーを textbox1.Resize イベントに追加してコードを少し変更すると、何が起こるかがわかります。tabPage1.Selected イベントは、タブ ページのコントロールのサイズが変更される前に発生するため、テキスト ボックスの幅を確認すると、サイズが変更される前に確認されます。

通常、サイズ変更は後で適切に行われるため、これは問題になりませんが、テキストボックスのサイズを何かに使用すると思いますか?

この問題を修正する独自の TabControl を作成できるはずですが、ここで何が機能するかを実験する必要があります。

于 2008-10-22T21:14:20.620 に答える
-1

Not sure if I understand the problem. But, you might use textbox's resize event to capture the width change OR form's resize.

In your example, does the select event of tabPage1 fire when you do step 3?

于 2008-10-22T20:56:44.290 に答える