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

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

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

環境  Visual Studio 2003 C# タブコントロールのタブ選択について質問があります。 Windows Application のForm にタブコントロールを配置。 タブ1からタブ2に選択された時点でメッセージを表示し「はい」であれば、タブ2へ、「いいえ」を選択した場合は、タブ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

  • Access VBAでタブコントロールで選択するタブをしていするには。

    Access VBAでタブコントロールで選択するタブをしていするには。 Access のフォーム上に,「ページ1」「ページ2」「ページ3」タブを配置しました。その横にボタンを3個配置して,ボタンクリックでそれぞれ対応するタブを選択(クリックしたのと同じ状態に)させたいのですが,どなたか方法を知りませんか? よろしくお願いいたします。

  • access タブコントロールのロック

    いつもお世話になっております。 accessのフォームが開くときに、タブコントロールの編集をロックしたいのですが、 下記の記述ですとエラーになってしまいます。 何がおかしいのかおしえてください。 ------------------------------ Private Sub Form_Load() Me.タブ.Locked = True End Sub ------------------------------ Private Sub Form_Load() Me.タブ.Pages("ページ1").Locked = True Me.タブ.Pages("ページ2").Locked = True Me.タブ.Pages("ページ3").Locked = True Me.タブ.Pages("ページ4").Locked = True Me.タブ.Pages("ページ5").Locked = True End Sub

  • ACCESS タブコントロールの切替

    オプショングループで1を選んだ場合、同じフォームに配置している、タブコントロールの「ア」のタブを、オプショングループの2を選択すると「イ」のタブを開くようにしたいのですが、どのようにしたらよいのでしょうか? そもそもタブを切り替えるコマンドは、何を使ったら良いのでしょうか? 素人の浅知恵で、SetFocusとかGoToControlとか使ってみるのですが上手く行かず、webで探すのですが思うような結果が見当たらず困っています。 是非是非、よろしくお願いいたします。 使用しているのはAccess2000です。

  • [Delphi]タブコントロールでタブを複数選択したい

    Delphi7/WindowsXPです。 TTabControlで、デザインがタブ形式(Style=tsTabs)で、タブ複数選択可能(MultiSelect=True)を有効にする方法はありますでしょうか? 各タブにはグループ別に分けられたデータリストがListViewで表示されているプログラムで、複数のグループの選択指定を取得したいのですが、TabControlのMultiSelectプロパティは、Styleが"tsButtons"か"tsFlatButtons"のときしか有効にならないようです。 タブ形式で複数選択ができれば、TTabControlコンポーネントにはこだわりません。 どなたかご存知の方がいらっしゃれば、アドバイスをお願いいたします。

  • VB.Net Tabコントロール中のすべてのタブで

    お世話になります。 Visual Studio 2012 を Windows 7 64Bit  にて使用しております。 Tabコントロールの全てのタブのタグ(Tag) に値を設定しており、変数と各タブページに格納してあるTag の値が一致したら、そのタブページのインデックスを取得できればと思っておりますが、 For Each Next 文にてそれをどう実現すればいいか困っております。 以下の文は プロパティ的にはめちゃくちゃですが、ニュアンスとして、こんな感じで実現できればと思っております。 指定タブコントロールの全てのタブの中でTagの値が 123 のタブがあったら、そのタブインデックスを取得する     Dim Flg As Integer = 0     For Each TabPage In Me.TabControl1.TabPages         If TabPage.Tag = 123 Then             Flg = TabPage.Index()             Exit For         End If     Next 何卒よろしくお願いいたします。

  • タブコントロールのオブジェクトのコピーについて

    VB初心者です。 現在、勉強をかねて簡単なアプリを作成しているのですが、 タブコントロールについてわからない点があるので、 もしお分かりでしたら教えてください。 現在行なおうとしていることは、 アクセスから取得してきたデータをタブコントロールに表示するということで、 データのレコード数分、タブを追加して表示させたいんです。 デザイナでページ数が1のタブコントロールを作成して、 コードで必要なだけページを追加するところまではできたのですが、 デザイナで作成したページに配置したテキストボックスなどのオブジェクトを、 新しく追加したページにコピーする方法がわからないんです。 そもそも、そういうことができるのかすらわからないのですが・・・ 初心者なのでかなり的外れな質問になっているかもしれませんが、 もしおわかりでしたら、よろしくお願いいたします。

  • タブコントロールについて

    お世話になっております VB.NET 2010 Windows7 Windowsフォーム画面の開発をしています タブコントロールについてです 現在、タブページを使用しており、1ページ目で検索、2ページ目に検索結果一覧、3ページ目で詳細が見れるようになっています 1ページ目に検索条件を入れ2ページ目のタブを押すと、入力ミスがあったら2ページ目に遷移せずに入力ミスしたコントロールの場所にフォーカスが飛び、正常なら検索され2ページ目に遷移します ここで質問なのですが、今現在TabControl.Selection イベントに入力チェック、検索処理を書いています 入力チェックでミスがあった場合にタブページを移動しないこと、1ページから2ページ遷移で検索処理を起こすため、次のタブページを検知しなければいけないからです ですが、入力ミスが起こった際、フォーカスが入力ミスした項目に飛びません 1ページ目の最初の項目に飛んでしまいます おそらく、タブページ移動(2ページ目に飛ぶ)→入力ミスでフォーカス移動→タブページ移動キャンセル(2ページ目から1ページ目に飛ぶことでタブコントロールにフォーカス移動)→タブページの次の項目 となっていると思われます DeSelectingイベントに入れると、入力ミスした際にエラーのある項目に飛ぶのですが、そうすると2ページ目に移動しようとしたのか、3ページ目に移動しようとしたのかが分からなくなってしまいます 押したタブページが検知でき、なおかつキャンセルされたときにフォーカスが移動できるような方法ありますでしょうか よろしくお願いします

  • データベースのレコードをform1で選択し、form2にも関連させたい。

    visual basic 2005 データベースはSQL server で初めてプログラムを開発しています。 form1で、データベースのレコードを選択し、form2に遷移してもそのデータベースのレコードを維持する方法はないでしょうか?  1 りんご あかい  2 みかん おれんじ  3 びわ  きいろ とデータベースがあり、form1には 2 みかん と選択表示させる。bottonを押すとform2に遷移し、おれんじ と表示させたい。でも あかい と表示される。 どんな方法があるのでしょうか?すいませんが初心者でも分かるやり方があれば教えて下さい。  

  • VC++ タブコントロールについて

    以下の環境にてタブコントロールを実装しようとしています。 ・VisualStudio2008 VC++ ・ネイティブ(.NET未使用) ・ダイアログベース、スタティックライブラリ タブを表示させるメインダイアログと他に、子ダイアログ3つを用意して タブが押されたときに表示をON/OFF(ShowWindow使用)させるものを作ったのですが、 以下の問題が出ています。 うまい対策または、タブコントロールの文献で参考になるサイトを教えてください。 [現象と質問] ・メインダイアログを移動させると子ダイアログが追従しない。  → OnPaint()にてOnTcnSelchangeSelectTab()を呼ぶようにしたら追従しましたが、    すばやくダイアログを動かすと、子ダイアログが遅れてついてくるように見えてしまいます。    子ダイアログを追従させるうまい方法(本来のやりかた)はどうすればよいでしょうか。 ・子ダイアログをクリックすると、メインダイアログのタイトルが薄くなる(裏に隠れるような感じ)。  → メインダイアログと子ダイアログのプロパティの組み合わせでなんとかなると思っていますが、    どのようにしたらいいのか、てこずっています。    アドバイスをいただけたらと思います。

  • C++とWin32APIでタブコントロールを作成するには

    C++のWin32APIで、MFCを使わずに、 ダイアログボックスの中にタブコントロールを実装したいのですが、 その方法が解らず困っています。 とりあえずウインドウにタブコントロールを 付ける事まではできたものの、 (MFCを使用しない方法で)ダイアログボックスの中に 表示させる方法が見つからないのです・・・。 VisualStudioを使用しているので、 ツールボックスの中にある「Tab Control」というものを ダイアログボックスの中に貼り付けてみましたが、 [Tab1]~[Tab5]までありますが見た目上だけのものなので、 当然実行してもそこには何もありません。 (項目も、タブを切り替える処理も追加してないので 当たり前ですよね^^;) この方法はやはりMFCを使用しないと無理なのでしょうか? もし方法がございましたら、どうかご伝授をよろしくお願いします

専門家に質問してみよう