• ベストアンサー

c# ドッキングしているコントロールを取得するには

 こんにちは。c#初心者です。  コントロールを制作しているのですが、その途中で「System.Windows.Forms.Splitter」のようにドッキングしているコントロールに対して働き掛ける処理で、そのドッキングしているコントロールを取得する方法が分からず苦戦しています。  視覚化すると、□を現在制作中の「SampleControl」、■を任意の「Control」、■、□共に「Dockプロパティ」が「DockType.Left」とすると、 ■□ のように並んでいる際に□内部で■を取得する方法です。  どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

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

  • ベストアンサー
回答No.1

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.dock.aspx によるとzオーダーに従って並べられるそうなので、Dock = DockStyle.Left、かつ、zオーダーが自分より大きいコントロールの中で、zオーダーが最小のものが左隣のコントロールになるようです。 少しだけ試してみたところ、Controls を foreach で回すとzオーダーの順で取得できるようなので、 次のようにするとできるようです。(確認が十分ではありません。) Form f = this.ParentForm; int myIndex = f.Controls.GetChildIndex(this); foreach (Control child in f.Controls) { if (child.Dock == DockStyle.Left) { if (myIndex < f.Controls.GetChildIndex(child)) { MessageBox.Show(child.Name); break; } } }

koumei000
質問者

お礼

 解答ありがとうございます。  おかげさまでうまくいきました。

関連するQ&A

  • C#、VB.NETのDockプロパティについて

    たとえばPanelコントロールのDockプロパティをTOPにした状態で、 後から追加したSplitterコントロールのDockプロパティをTOPにすると、 Panelコントロールの下部に配置されますが、Panelの上部にSplitter を配置してもらうにはどうすればよいでしょうか? TabIndexの順番とは無関係のようですが・・・。

  • フォーカスを持っているコントロールを取得する方法はありますか?

    こんにちは。 JavaScriptで、イベントを使用せずに、任意のタイミングで現在フォーカスをもっているコントロールを取得することはできないでしょうか? プロパティでフォーカスされているかどうかを示すBool値を返すのとかはないですか?? どうぞ教えてください。

  • エクセル フォーム上の全てのコントロールを取得した

    エクセル フォーム上の全てのコントロールを取得したい http://okwave.jp/qa/q4879853.html のNo.1さんの回答を参考に、 Sub try() Dim i As Integer Dim StrFormName As String StrFormName = "フォーム1" For i = 0 To Forms(StrFormName).Controls.Count - 1 Debug.Print Forms(StrFormName).Controls.Item(i).Name Next End Sub を作ったのですが、 「Forms」の部分が、 「Sub、Function、または Property が定義されていません。(Error 35)」 というコンパイルエラーになってしまいます。 上記のコードをアクセスVBAにつけると、全てのコントロール名が取得できます。 同じようにエクセルで使うにはどこを修正すればいいでしょうか? フォーム名は、変数に入れて使いたいです。

  • コントロール名とそのプロパティー名を取得したい

    Form の Top/Left の位置を INI ファイルから取得しようと思います。 INIファイルの構造は   [コントロール名]   プロパティー=Value つまり   [Form]   Top=300 という感じです。 WritePrivateProfileString に "Form","Top" というパラメータを送りたいのですが、 この場合のオブジェクト名である"Form"、プロパティ名である"TOP"はどこで取得できるのでしょうか?

  • なぜエラーになるのでしょう?アクティブコントロール

    ちょっと変なやり方かもしれないのですが、都合上こうやりたいので教えてください。 フォーム1の中にフォーム2を入れてサブフォームとして フォーム2の中にコマンドボタンを一つ置きました。 そのコマンドボタンを押した時に、そのコマンドボタン名を取得したいのですがうまくできません。 フォームは20個ぐらいあってこれと同じ動きをしたいので、 フォームモジュールには Private Sub コマンド0_Click() Call アクティブコントロール名を取得する End Sub として、 標準モジュールにコードは書いています。 Sub アクティブコントロール名を取得する() Dim フォーム As String フォーム = Screen.ActiveForm.Name MsgBox "アクティブコントロール名" & Forms(フォーム).ActiveControl.Caption End Sub にすると、オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)になります。 そもそも、フォーム = Screen.ActiveForm.Nameの時点で、フォーム1になっています。 実際のコマンドボタンはフォーム2にあるのに。 なので、無理矢理 MsgBox "アクティブコントロール名" & Forms("フォーム2").ActiveControl.Caption にしたら、 実行時エラー2450 マクロの式またはVisualBasicコードで参照されている'フォーム2'が見つかりません。 という違うエラーになりました。 Sub アクティブコントロール名を取得する() Dim フォーム As String フォーム = Screen.ActiveForm.Name Forms("フォーム2").SetFocus MsgBox "アクティブコントロール名" & Forms("フォーム2").ActiveControl.Caption End Sub にすればいいのかな?と思ったら Forms("フォーム2").SetFocusでアウトでした。 もともとはサブフォームのコントロールから発信したイベントなのに、 サブフォームのコントロールの値が取れないのでしょうか? 実際のmdbファイルではコマンドボタンではなくテキストです。 ご回答よろしくお願いします。

  • 【VB2005】コントロールのサイズ自動取得

    現在、画面の大きさにより、ラベル、テキストボックス等の コントロールを動的に配置してまして、 画面サイズを適当に変えると、 コントロールの大きさが自動で変更されるのですが、 ボタンを押して、新たにコントロールを配置したときに、 画面が大きい画面なのに、自分で決めた値をそのままコントロールにプロパティを代入して作るために、 画面にあわないコントロールサイズになります。 倍率が判らないために、うまく今の画面にマッチしたコントロールの プロパティ(大きさ、フォント)が設定できません。 どういう方法で自動取得のコントロールを追加できるか、 お知恵を貸してください。

  • 【VB.NET】カスタムコントロールのプロパティ

    お世話になっております カスタムコントロールのプロパティについて質問です InputManのGcTextBoxを継承したカスタムコントロールを作成しました。 カスタムコントロールにはPublicのプロパティがあり、その中で必要がなくなったプロパティがあるため削除しました。 しかし、削除するとカスタムコントロールを使用しているFormのDesignerファイルで多数のエラーが出ており、見てみると削除したプロパティの設定が残っていました。 designerファイルを一つ一つ開いて消そうと思いましたが、かなり多いため非常に手間がかかります。 そこで相談なんですが、なにか一括、もしくは自動で消す方法等あればご教授願います。 ちなみに環境はVisualStudio2008でコントロールはInputMan for Windows Forms 6.0jを使用しています。

  • APIで作成したコモンコントロールのイベント取得方法

    こんにちは。 http://www.mitene.or.jp/~sugisita/vb6_cmctl.html にある、ツリービューコントロールの カテゴリーのサンプルを参考にして APIで、コントロールを使えるように苦戦しております。 表示はできるのですが、表示させたコントロールのイベント(click等)を取得する方法が分かりません。 ご存知の方がいらっしゃいましたら、よろしくお願いします。

  • 【VB 2005】継承したコントロールにプロパティを追加するには?

    System.Windows.Forms.Labelを継承して 背景や、フォントを設定することは出来るのですが これをプロパティを使用して個別に設定する方法を探しています。 例えば LabelSizeというプロパティを作成し Small、Mediam、Largeから選択された 値によってコントロールの大きさを変えたいと思っています。 よろしくお願いします。

  • C言語でのEDITコントロールからの数字の取得について質問があります。

    C言語でのEDITコントロールからの数字の取得について質問があります。 case WM_CREATE: hwndTempo = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT") , TEXT("120") , WS_CHILD | WS_VISIBLE | ES_LEFT | ES_NUMBER , 0 , 0 , 200 , 30 , hWnd, (HMENU)3, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE) , NULL); break; このようにEDITコントロールを作成したとき、どのように書かれている数字(初期設定では120)を取得することができるのでしょうか? ためしに文字型で取得してから変換しようと思い、 ボタンを押した時の処理として char szEdit1[128]; GetDlgItemText(hWnd, hwndTempo, szEdit1,64); と入力してみたのですが、 「error C2664: 'GetDlgItemTextW' : 2 番目の引数を 'HWND' から 'int' に変換できません。」 となってしまいました。 最近始めたばかりでインスタンスやウィンドウハンドルの指定などが間違っているのではないかと思いますが、いまひとつよくわかりません。 「GetDlgItemText」の行をコメントアウトすればエディットとボタンコントロールは正常に表示されます。 開発環境がVisual C++ 2008 Express Editionであるため、リソースエディタは使っていません。 サンプルの多くがIDC_EDIT1を使っているのでどう参考にすればよいか良く見えません。 この方法を学習したら「GetDlgItemInt」を使って直接取得してみる予定です。 出来れば単純なサンプルソースを提示していただけると助かります。 ではよろしくお願いします。

専門家に質問してみよう