• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:タブコントロールのタブ選択について)

タブコントロールのタブ選択について

このQ&Aのポイント
  • Visual Studio 2003 C# 環境でタブコントロールのタブ選択について質問があります。
  • タブコントロールのタブを選択した際にメッセージを表示し、'はい'を選択した場合はタブ2に遷移し、'いいえ'を選択した場合はタブ1のままに保つ方法を実装したいです。
  • 一旦タブ2に遷移してからタブ1に戻る方法は見た目的に良くないため、別の方法を探しています。Visual Studio 2005 では Selecting イベントで e.Cancel = true; という方法でも一旦タブ2に遷移してしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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); }

6mmruled
質問者

お礼

丁寧なご回答ありがとうございました。 動作をすることを確認しました。

その他の回答 (1)

回答No.1

 こんにちは。  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; } }

6mmruled
質問者

補足

ご回答ありがとうございます。 Visual Studio 2003 C# の場合 Deselecting がないのですが、その場合はどのように 対応すればよいですか? 度々の質問ですみません。 ご存知であれば教えてください。

関連するQ&A

専門家に質問してみよう