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

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

ただいまの
回答率

90.47%

  • C#

    9245questions

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

  • Visual Studio

    2423questions

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

C#のcomboboxの要素による条件分岐

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,759
退会済みユーザー

退会済みユーザー

現在C#を用いて、
マウスのドラッグで矩形を描くプログラムを作成しています。
描く矩形の形は、comboboxによって変えようと思います。

ObjSelectFrm.cs

namespace ObjectSelectTool
{
    public partial class ObjSelectFrm : Form
    {

        #region インターナルクラス
        /// <summary>
        /// 効果オブジェクトをコードのセットクラス
        /// </summary>
        internal class BaseImage
        {
            /// <summary>
            /// Image ファイル名称
            /// </summary>
            public string Fname
            {
                set;
                get;
            }
        }
        #endregion

        #region プロパティ
        /// <summary>
        /// ユーザイベント
        /// </summary>
        public Event.ObjsEventCalled EventCalled
        {
            set { this.eventcalled = value; }
            get { return this.eventcalled; }
        }
        #endregion

        #region コンストラクター

        /// <summary>
        /// コンストラクター
        /// </summary>
        public ObjSelectFrm()
        {
            InitializeComponent();
            this.cntlmouse = new SelectObjs.ControlMouse();
            this.attrigrp = new SelectObjs.AttributeGroup();
            this.eventcalled = new Event.ObjsEventCalled();
        }

        #endregion

        #region プライベート変数

        //ベース画像
        private const string BASE_IMAGE = "\\fruit.jpg";
        //マウス制御オブジェクト
        private SelectObjs.ControlMouse cntlmouse = null;
        //オブジェクトリスト管理
         private SelectObjs.AttributeGroup attrigrp =null;
        //グラフィックス管理
        private ToolGraphics.ContorlGraphics cntlgra = null;
        //ユーザイベント
        private Event.ObjsEventCalled eventcalled = null;

        #endregion

        #region フォームロード

        /// <summary>
        /// フォームロードイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ObjSelectFrm_Load(object sender, EventArgs e)
        {
            //コンボボックスに要素を追加
            comboBox1.Items.Add("四角形");
            comboBox1.Items.Add("楕円形");

            //コンボボックスの初期値設定
            comboBox1.SelectedIndex = 0;
        }
        private void comboBox1_SelectedIndexChanged(object sender, 
        EventArgs e)
        {

        }
    }
}

このようなコンボボックスがあって、
外部のクラスでDrewしたいのですが、
その時に
if(){
DrawRectangle
}else{
DrawEllipse
}
としたいとき、ifのかっこの中の条件はどのようにしてあげればいいか
お教えいただきたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

if文で何を条件にするか…?
とりあえず上記の条件であればシンプルに考えれば以下ですね。

if (comboBox1.SelectedIndex == 0)
{
    DrawRectangle();
}
else
{
    DrawEllipse();
}

でも図形の種類が増える度にif文を追加していくのは微妙ですよね。
並列的な処理分岐にはswitch文を使います。

switch (comboBox1.SelectedIndex)
{
case 0:
    DrawRectangle();
    break;
case 1:
    DrawEllipse();
    break;
}

よりよい形もありますが、そちらはまだ早いのでリンクだけにしておきます。

デザインパターンとOpen-Closed Principle

上記サイトは直接的にこの問題について回答したものではありませんので要約すると、if文やswitch文を使わずに図形描画に対応することで、描画する図形を増やしたい場合に、描画処理を変更しなくてもよくなります。ブックマークされておくと良いでしょう。


次のステップとしては、コンボボックスと描画処理を分けましょう。

・図形を指定する設定値を作る
・コンボボックスから描く図形の種類を得る
・描画処理に利用する

図形を指定する設定値を作る

今回はもっとも単純な方法として、定数を使いましょう。

enum Shape
{
    None,
    Rectangle,
    Ellipse
}

コンボボックスから描く図形の種類を得る

以下はWindowsFormを使う上での最良の形ではありません。
しかし、とりあえずこの関数を呼べば設定値を得る、という目的は達成されます。
よりよい形が何かを模索していくと良いでしょう。
重要なのは、この関数を呼べば何を描こうとしているのか分かるようになっているということです。

Shape GetSelectedShape()
{
    switch(comboBox1.SelectedIndex)
    {
    case 0: return Shape.Rectangle;
    case 1: return Shape.Ellipse;
    }
    return Shape.None;
}

// こういう値は通常C#ではプロパティにします。
Shape SelectedShape
{
    get
    {
        switch(comboBox1.SelectedIndex)
        {
        case 0: return Shape.Rectangle;
        case 1: return Shape.Ellipse;
        }
        return Shape.None;
    }
}

描画処理に利用する
設定値を取得できるようになったら、comboBox1.SelectedIndexを置き換えましょう。
これで、インデックス値と描画の選択を分離することができます。

switch (GetSelectedShape())
{
case Shape.Rectangle:
    DrawRectangle();
    break;
case Shape.Ellipse:
    DrawEllipse();
    break;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/21 11:34

    回答ありがとうございます。はじめ、自分も一番上に書いてくださった方法でやろうとしましたが、
    このコンテキストにcomboBox1という名前がが存在しません。というエラーが出てしまいます。書洩らして申し訳ございません。こちらの解決方法をお教えいただけないでしょうかよろしくお願いします。

    キャンセル

  • 2017/04/21 16:53

    ObjSelectFrmとは別のフォームからObjSelectFrmのcomboBox1を見たいのであればModifiersプロパティを変更する必要があります。デザイン時にcomboBox1のプロパティでModifiersをinternalに設定して、利用側フォームので「《ObjSelectFrmのインスタンス》.comboBox1」のようなコードでアクセスしてみてください。

    キャンセル

  • 2017/04/24 10:38

    if文まったく関係ないですね…

    外部クラスのインスタンス化、呼び出しはどのようになっているでしょうか。
    それによって最適な方法は変わるので即答できません。

    また、現在のレベルなら外部クラスを止めるのも手です。
    何故外部クラスにするのかさえ判断する力がまだなさそうだからです。

    キャンセル

checkベストアンサー

0

DisplayMember, ValueMember を使ったこんな方法もありますので、参考になりましたらどうぞ。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DisplayMember = "Text";
            comboBox1.ValueMember = "Action";
            comboBox1.DataSource = new[]
            {
                new
                {
                    Text = "四角形",
                    Action = new Action(() =>
                    {
                        var random = new Random();
                        CreateGraphics()
                            .DrawRectangle(
                                new Pen(new SolidBrush(Color.Red)),
                                new Rectangle(
                                    random.Next(ClientSize.Width / 2),
                                    random.Next(ClientSize.Height / 2),
                                    random.Next(ClientSize.Width / 2),
                                    random.Next(ClientSize.Height / 2)
                                )
                            );
                    })
                },
                new
                {
                    Text = "楕円形",
                    Action = new Action(() =>
                    {
                        var random = new Random();
                        CreateGraphics()
                            .DrawEllipse(
                                new Pen(new SolidBrush(Color.Green)),
                                new Rectangle(
                                    random.Next(ClientSize.Width / 2),
                                    random.Next(ClientSize.Height / 2),
                                    random.Next(ClientSize.Width / 2),
                                    random.Next(ClientSize.Height / 2)
                                )
                            );
                    })
                }
            };
        }

        private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            var comboBox = sender as ComboBox;
            if (comboBox == null) return;
            var action = comboBox.SelectedValue as Action;
            if (action == null) return;
            action();
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9245questions

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

  • Visual Studio

    2423questions

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