- ベストアンサー
タブコントロールのタブ選択について
- Visual Studio 2003 C# 環境でタブコントロールのタブ選択について質問があります。
- タブコントロールのタブを選択した際にメッセージを表示し、'はい'を選択した場合はタブ2に遷移し、'いいえ'を選択した場合はタブ1のままに保つ方法を実装したいです。
- 一旦タブ2に遷移してからタブ1に戻る方法は見た目的に良くないため、別の方法を探しています。Visual Studio 2005 では Selecting イベントで e.Cancel = true; という方法でも一旦タブ2に遷移してしまいます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。補足頂きました。 すんません、.Netのバージョンを確認していませんでした。 当方が思いつく限りでは、WndProcメソッドをオーバーライドして、VC++のウィンドウプロシージャと同じ処理をするしかないように思えます。 今当方のIEが不調でMSDNのページがスクロール出来ないのでWndProcメソッドが2003に対応しているかどうか見れないのですが、以下では駄目でしょうか。 //WM_NOTIFYメッセージのcode == TCN_SELCHANGINGをトラップする const Int32 WM_NOTIFY = 0x004E; //code側の定数 const Int32 TCN_SELCHANGING = -550 - 2; //NMHDR構造体を定義する //http://msdn.microsoft.com/en-us/library/bb775514(VS.85).aspx [StructLayout(LayoutKind.Sequential)] public struct NMHDR { public IntPtr hwndFrom; public Int32 idFrom; public Int32 code; } //ウィンドウプロシージャのオーバーライド //http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.wndproc.aspx protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_NOTIFY: //NMHDR* hdr = (NMHDR*)lParamの遂行 NMHDR hdr = new NMHDR(); hdr = (NMHDR)Marshal.PtrToStructure(m.LParam, hdr.GetType()); //タブが選択されている瞬間 //http://msdn.microsoft.com/en-us/library/bb760571(VS.85).aspx if (hdr.code == TCN_SELCHANGING) { //タブのインデックス if (this.tabControl1.SelectedIndex == 0) { //キャンセルの場合 if (MessageBox.Show("確認", "タブ2へ移動しますか?", MessageBoxButtons.YesNo) != DialogResult.Yes) { //Resultに1を代入してキャンセルする m.Result = (IntPtr)1; //処理したのでシステムに渡さないで引き返す return; } } } break; } //該当しないのでシステムに処理させる base.WndProc(ref m); }
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 Selectingイベントより先行するのは、Deselectingイベントの様です。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.tabcontrol.deselecting(VS.80).aspx 以下で期待通りの動作をする筈です(確認済み)。 private void tabControl1_Deselecting(object sender, TabControlCancelEventArgs e) { if (e.TabPageIndex == 0) { if (MessageBox.Show("確認", "タブ2へ移動しますか?", MessageBoxButtons.YesNo) != DialogResult.Yes) e.Cancel = true; } }
補足
ご回答ありがとうございます。 Visual Studio 2003 C# の場合 Deselecting がないのですが、その場合はどのように 対応すればよいですか? 度々の質問ですみません。 ご存知であれば教えてください。
お礼
丁寧なご回答ありがとうございました。 動作をすることを確認しました。