質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

3回答

6130閲覧

【WindowsFormアプリケーション】大分類から機能を選択するようなメニュー画面を実装したい

sujico.net

総合スコア453

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2018/08/08 08:22

編集2018/08/08 08:35

実現したいこと

WindowsFormアプリケーションにて、左ペインの大分類ボタンを押下すると対応する小カテゴリのボタンが右ペインに表示されるような
よくあるメニュー画面を実装したいです。

質問したいこと

適切な実装方法のイメージがわかないので、より良いアイディアがあればご教示いただきたく存じます。
また稚拙ではありますが、私が考えうる精一杯の実装方法(後述)も紹介させて頂きます。

画面イメージ

イメージ説明
panel1のボタンを押すと、対応するボタンがpanel2に表示される という動作イメージ

考えた実装方法

panel1のボタンを押下した際のクリックイベントで、panel2の領域内にサブフォームを読み込む。
サブフォームはWindowsの枠を削除しており、カテゴリ別のボタンが配置されている…というイメージ。

質問に至った経緯

考えた方法で実装可能ではありますが、
なんとなくスマートではない、無駄の多い実装方法だという考えが払拭できません。

もしかっこいい実装方法をご存知の方がいらっしゃれば、是非参考にさせて頂きたいと考えました。

開発環境

VisualStudio2017
.NETFramework4.6.1
C#
Windows7

不足情報があれば、追記させていただきます。
何卒、宜しくお願い致します。

【追記】

・何故ボタンで切り替えようと思ったか?
→ 動機として、なんとなくWebっぽく見えるかなと思い選びました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

TabControl でいいのではないでしょうか?

投稿2018/08/08 08:26

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sujico.net

2018/08/08 08:29

ご回答頂きありがとうございます。 そもそもボタンを使うのをやめてTabControlで切り替えたほうがいいということでしょうか?
Zuishin

2018/08/08 08:47

見た目を除き TabControl そのものだと思いました。 TabControl にはユーザーも慣れていますので、ボタンを使った UI を新たに一から作るだけのアドバンテージがあるかどうかは疑問です。 見た目に凝るなら、Windows Forms でなく WPF の方がいいかもしれません。
Zuishin

2018/08/08 08:57

それでもこの形で実装したいというのであれば、画面の数だけコントロールを作り、ボタンクリックで BringToFront() して Focus() するのが簡単かと思います。
sujico.net

2018/08/08 08:59

確かに仰るとおりです。 一度コントロールの選定を見直してみたいと思います。 ありがとうございます!
sujico.net

2018/08/08 08:59

イメージとしては https://water2litter.net/gin/?p=1438 このような感じですね。 ありがとうございます。 なにが一番適切か、検証してみたいと思います。
guest

0

概要

業務アプリケーションで考えたやり方としては、
ListViewを使用して、メニューを自前でレンダリングするという方法を実装しました。
ListViewはツリー構造を作れるので、階層構造が2段階までという前提であるならば、
適用可能かと存じます。

実現方法

ListViewを2つ用意し、左側にグループ化されたメニューを配置し、
右側に詳細を表示します。
左側のListViewにはグループを登録すると同時に、明細を登録します。
左側のListViewアイテムが選択されたときに、選択されたアイテムのTagを参照して
右側のListViewにアイテムを追加します。
※一般的にはやっている人が少なそうなので、微妙なのかもしれません

理由

このような複雑な仕組みにした理由は以下の通りなので、工数がある程度とれる場合のみ採用できる内容かと存じます。

  • 可変メニューである
  • CSVデータの読み込みでメニューの構成内容を変更できるようにしている
  • ランチャのような動作をする(外部exeを実行して、画面が表示されたらメニューを非表示にして、プロセスが終了したら再表示する)
  • 起動後の操作により特定のデバイスと接続状態になってから操作可能にする
  • デバイスによって特定の条件を満たす場合は非表示にするものがある
  • 各メニューに説明を併記する

サンプル

sample

Github menu sample

※.NET Core 3.0では残念ながら上記コードは動作しません、.NET Frameworkでの動作を期待します
.NET Core3.1で動作しました。当時(2020/01)OwnerDrawイベントが全く動かなかったのですが動くようになっていて感動しました。

投稿2018/08/08 13:30

編集2020/04/21 15:29
testset

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sujico.net

2018/08/08 23:51

のちのち変更できる点が非常に魅力的だと思います! ListViewを使ってそんなことが出来るんですね……ほぼ使ったことが無いので実際にどう実装すればいいかイメージがすぐ落ちてこないので、似たようなことをしている人がいないか調べてみます。 明示的で分かりやすいご提案ありがとうございます! ベストアンサーを既に投票してしまったため、ベストアンサーを差し上げることが出来かねますが、高評価+1させて頂きます。 ありがとうございます!
testset

2018/08/09 09:51

調べた限り、同じような実装を見ていないので、気が向いたらどこかに投稿するかもしれません。 ただ、前述の通り、工数がある程度潤沢にないと実現が難しいことはお忘れなく。(試験込みで10人日程度)
guest

0

この画面構成を使うのならば、[メニュー1][メニュー2][メニュー3]...それぞれを押された時に何かしらのフラグを立てて、panel2のボタンのTextやVisibleを切り替えて、処理もフラグで分岐させるとか?

ZuishinさんのようにTabで画面を切り替えたほうがわかりやすいと思いますが...

投稿2018/08/08 08:30

syameimaru

総合スコア181

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sujico.net

2018/08/08 08:33

https://water2litter.net/gin/?p=1438 こんな感じでしょうか! うーん…そちらの方が分かりやすいようであれば、その実装の方がいいかも知れません…。 ご回答頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問