コンボボックスのドロップダウンの横幅を調整しておいてほしい | プログラミングがわからなすぎる

プログラミングがわからなすぎる

気が向いた時の備忘録。プログラミングは好きなのに物凄く単純なものしか理解できないからメモしていくうちに覚えられたらいいな
ターゲットフレームワークは大体4.7.2

前回もコンボボックスの横幅を、入れたアイテムの横幅によって変更させましたが

今回はカスタムコントロールでなんとかできないかなと思ったので考えてみます

 

作りたいものとしては、コンボボックスに設定された文字で

一番文字数が多いものの横幅が、コンボボックスの横幅(+5px)を超える場合は

ドロップダウン部分が勝手に広がってくれるコンボボックスです

+5pxするのは個人的に横幅に余裕0なドロップダウンが好きじゃないからです

 

動かすサンプル 

WindowsFormアプリケーションを作成し、

カスタムしたコンボボックスをForm上に貼り付けます

見た目は普通のコンボボックスです

 

 

カスタムコンボボックスは作成してビルドしておきます

名前をCustomComboBoxにしました

以下ソースです

 

 CustomComboBox.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace TestApp
{
    public partial class CustomComboBox : ComboBox
    {
        public CustomComboBox()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 追加したアイテムの最長文字数の横幅+5pxをドロップダウンの横幅にします
        /// </summary>
        /// <param name="items">追加するアイテムのList</param>
        public void AddRangeWithChange(List<string> items)
        {
            this.Items.AddRange(items.ToArray());
            string longStr = "";
            foreach (string str in items)
            {
                // 最長文字数のワードを取得
                if (longStr.Length < str.Length)
                    longStr = str;
            }

            // 取得したワードの横幅を取得
            Font font = this.Font;
            Graphics graphics = Graphics.FromImage(new Bitmap(1, 1));
            SizeF fontSize = graphics.MeasureString(longStr, font);

            // コンボボックスの横幅を超える場合、ドロップダウン部分の横幅を変更
            if (this.Size.Width < (int)Math.Round(fontSize.Width) + 5)
                this.DropDownWidth = (int)Math.Round(fontSize.Width) + 5;
        }

    }
}

(ComboBoxを継承したらまたデザイナーが構文エラーを吐いたので

その行をこっそりコメントアウトしました)

 

AddRangeWithChangeメソッドを作成しました

このメソッドにアイテム(List型)を渡すと

貰ったアイテムから最長文字数のワードを探し、

横幅を比較してドロップダウンの幅の設定を変えてくれます

 

カスタムコンボボックスクラスを作成したらプロジェクトをビルドして、

ツールボックスに現れたCustomComboBoxをドラッグ&ドロップで

Formに貼り付けます

 

以下Form1の中身です

 

 Form1.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

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

        private void Form1_Load(object sender, EventArgs e)
        {
            List<string> comboItems = new List<string>
            {
                "いちご",
                "パイナップル",
                "もも",
                "りんご",
                "デコポン"
            };

            customComboBox1.AddRangeWithChange(comboItems);
        }
    }
}

 

 

実行結果 

まずコンボボックスの横幅が小さいときを動かしてみます

 

ドロップダウンの横幅は、文字数最長の「パイナップル」より

少し広い幅で表示してくれています

 

 

次はコンボボックスを、どうみても「パイナップル」より長い横幅にしてみました

 

ドロップダウンの横幅はコンボボックスの横幅と一緒になっているので

想定通りの結果です

 

 

本当はAddRangeメソッドを呼び出すだけで

何とかしてくれるコンボボックスを作りたかったのですが

よくわからなくて断念…

 

今の状態だとアイテムの中身を削除したときや、

アイテムを1つずつAddしたいときには

ドロップダウンの横幅が変わってくれないので

そういう操作をしたいときはもうちょっと考えないとですね

あとコンボボックスとドロップダウンの横幅を自分で調整してしまったときも

うまく動かないかも