TabControlでのイベントの特殊性に関する質問
-
03-07-2019 - |
質問
以下に特有の問題について少し説明します。
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#コードを実行すると、タブコントロールを含む小さなフォームが作成されます。 tabcontrol内では、最初のタブにtexboxがあります。次の手順を実行すると、問題が表示されます。
- tabPage2を選択します(textBox1の幅はフォームタイトルで報告されます)
- フォームのサイズを変更
- tabPage1を選択します(間違ったtextBox1幅が報告されます)
ここで何が起こっているのでしょうか?テキストボックスは、報告されているものより明らかに大きいです。 tabPage2をもう一度クリックすると、正しいサイズが更新されます。明らかに、textBox1の幅を更新するイベントがあります。 tabPage1が選択されているときにこれをトリガーできますか?
解決
まず、完全なプログラムに感謝します-何が起こっているのかを簡単に解決できるようになりました!
テキストボックスは表示されませんが、サイズは変更されません。 tabPage1を選択すると、Selectedイベントが発生し、コントロールが表示される前に 、テキストボックスが再びレイアウトされます。
今、それが起こっている理由です-しかし、あなたの本当の状況は何ですか?変更するコントロールのサイズを実際にキャプチャする場合は、Resizeイベントにサブスクライブします。そうでない場合は、達成しようとしていることについて詳しく説明してください。
他のヒント
発生しているのは、タブページが表示される前に 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を作成できるはずですが、ここで何が機能するかを確認するには実験する必要があります。
問題を理解しているかどうかわかりません。 ただし、テキストボックスのサイズ変更イベントを使用して、幅の変更またはフォームのサイズ変更をキャプチャすることもできます。
例では、ステップ3を実行するとtabPage1のselectイベントが発生しますか?