private void button1_Click(object sender, EventArgs e){
TabControl tab = new TabControl();
TabPage page = new TabPage();
tab.TabPages.Insert(0, page);
page.Text = "test";
}
嘘みたいだろ…落ちるんだぜこれで
TabControlのコントロールハンドラが作成されていない状態でTabPageをインサートすると、
TabPageのParentはTabControlになっているのに、
TabControlのTabPagesには追加したTabPageが入っていないという状態になります。
で、この状態でTabPageのTextやImageIndexを設定すると、
TabControl内部の処理で「TabPageが自身の何番目にあるか」を探そうとするんですが、
TabControlにはTabPageが追加されてない状態になってるんでインデックスが-1になって、
これで内部でInvalidArgumentExceptionが発生する、って動きしてます。
こんな簡単なコードで.NET Framework内部でエラーが出せるってどうだろうと思いますが…
ちなみにInsertはダメだけどAddなら大丈夫のようです。
このため、Addを活用することでInsertまがいのことを行うことができます。
とりあえず、Extensionで実装してみました。
public static class TabPageCollectionExtension
{
public static void FixedInsert(this TabControl.TabPageCollection tabPages, int index, TabPage page)
{
List<TabPage> tempList = new List<TabPage>();
for (int i = 0; i < tabPages.Count; i++)
{
tempList.Add(tabPages[i]);
}
tabPages.Clear();
tempList.Insert(index, page);
for (int i = 0; i < tempList.Count; i++)
{
tabPages.Add(tempList[i]);
}
}
}
使い方はこんな感じ。
private void button2_Click(object sender, EventArgs e)
{
TabControl tab = new TabControl();
TabPage page1 = new TabPage("page1");
TabPage page2 = new TabPage("page2");
TabPage page3 = new TabPage("page3");
tab.TabPages.Add(page1);
tab.TabPages.FixedInsert(1, page2);
tab.TabPages.FixedInsert(0, page3);
this.Controls.Add(tab);
}
こんなシュールなことをやらされるとは思いませんでした…
コントロールハンドラの恐ろしさを知った一日でした。
(追記)
気になって調べてみたら、MSDNフォーラムで語られていました。
IntPtr h = this.tabControl1.Handle;要は、これを足せと。知らなきゃわからんだろこれ…
0 件のコメント:
コメントを投稿