Symfoware

Symfowareについての考察blog

C# ComboBoxにデータを追加、取得  [Ubuntu 11.04 + Mono]

Ubuntu + Monoで開発できる環境を作りました。
Ubuntu 11.04にC#(Mono)開発環境のMonoDevelop 2.4をインストールする



C#、あんまり触ったことないので地道に使い方を調べ中。
Comboについて調べた内容をメモしておきます。




データの追加はItems.Add()



コンボボックスにデータを追加する簡単なサンプル。
Combo.Items.Add()でコンボボックスのリストにデータを追加できます。


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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            ComboBox combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //コンボボックスにデータを追加する
            combo.Items.Add("北海道");
            combo.Items.Add("青森");
            combo.Items.Add("秋田");
            combo.Items.Add("岩手");
            
            this.Controls.Add(combo);
        }
    }
}






実行結果は以下のとおり。

30_001.png







表示スタイルの変更はDropDownStyle



コンボボックスの表示スタイルは、DropDownStyleで変更できます。
指定できるのは、以下のとおり。


ComboBoxStyle.DropDown (デフォルト。編集可能コンボボックス)
ComboBoxStyle.DropDownList (編集不可能コンボボックス)
ComboBoxStyle.Simple (リスト部分を常に表示)





各々、コードと画面の比較はこんな感じ。


combo.DropDownStyle = ComboBoxStyle.DropDown;



30_002.png




combo.DropDownStyle = ComboBoxStyle.DropDownList;



30_003.png




combo.DropDownStyle = ComboBoxStyle.Simple;



30_004.png





初期値の設定はSelectedIndex



SelectedIndexを使用すると、選択状態となる項目を変更できます。


combo.SelectedIndex = 2;



というコードを追加すると、「秋田」が選択された状態となります。

30_005.png





項目の一括設定はAddRange



AddRangeを使用することで、一括でコンボボックス内のデータを設定することができます。



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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            ComboBox combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //一括でコンボボックスにデータを追加する
            combo.Items.AddRange(new String[]{"北海道", "青森", "秋田", "岩手"});
            
            /* 個別に設定する場合
            combo.Items.Add("北海道");
            combo.Items.Add("青森");
            combo.Items.Add("秋田");
            combo.Items.Add("岩手");
            */
            
            this.Controls.Add(combo);
        }
    }
}





もちろん、

            combo.Items.AddRange(new String[]{"北海道", "青森"});
            combo.Items.AddRange(new String[]{"秋田", "岩手"});


このようにAddRangeを複数回呼び出して設定してもOK。






オートコンプリート(自動補完)機能を有効にする



AutoCompleteModeにAutoCompleteMode.AppendやAutoCompleteMode.Suggestを
指定すると、コンボボックスに文字を入力したとき自動補完してくれるようになります。

また、上記の設定を行う場合には、検索対象とするアイテムを合わせて指定する必要があるようです。
コンボボックスに設定されている値を検索対象とする場合には、


combo.AutoCompleteSource = AutoCompleteSource.ListItems;



とすればよいようです。


まずは、Appendを指定した場合のソース全文と動作。


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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            ComboBox combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //一括でコンボボックスにデータを追加する
            combo.Items.AddRange(new String[]{"Python", "C#", "Perl", "Ruby", "Java"});
            //候補を追加して表示
            combo.AutoCompleteMode = AutoCompleteMode.Append;
            //検索対象はコンボボックスに設定されているアイテム
            combo.AutoCompleteSource = AutoCompleteSource.ListItems;
            
            this.Controls.Add(combo);
        }
    }
}






「P」と入力すると、「erl」が自動補完されます。

30_006.png


「Py」まで入力すると候補が「thon」に自動的に変更されました。

30_007.png




ソースの一部を変更し、AutoCompleteMode.Suggestを指定してみます。


combo.AutoCompleteMode = AutoCompleteMode.Suggest;



30_008.png

「P」という入力に対して「Perl」と「Python」2つの候補が表示されました。



最後に

combo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;


としてみます。

30_009.png

「P」という入力に対して、テキストボックスには「erl」という補完文字を追加。
リストには、「Perl」と「Python」を表示するようになります。






選択している項目の取得



現在選択状態にある項目を取得するには、

Text:表示している文字列
SelectedIndex:選択しているインデックス


が使用できます。


サンプルはこんな感じ。


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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        ComboBox combo;
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //一括でコンボボックスにデータを追加する
            combo.Items.AddRange(new String[]{"Python", "C#", "Perl", "Ruby", "Java"});
            this.Controls.Add(combo);
            
            Button btn = new Button();
            btn.Location = new Point(50, 100);
            btn.Text = "クリック";
            btn.Click += HandleBtnClick;
            this.Controls.Add(btn);
            
        }

        void HandleBtnClick (object sender, EventArgs e)
        {
            MessageBox.Show(combo.SelectedIndex + "番目の" + combo.Text + "を選択");
        }
        
        
    }
}





30_010.png





コンボボックス内のデータのソート



Sortedをtrueに指定しておくと、コンボボックス内のデータを自動的にソートしてくれます。


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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        ComboBox combo;
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //一括でコンボボックスにデータを追加する
            combo.Items.AddRange(new String[]{"z", "y", "x", "b", "a"});
            this.Controls.Add(combo);
            
            Button btn = new Button();
            btn.Location = new Point(50, 100);
            btn.Text = "クリック";
            btn.Click += HandleBtnClick;
            this.Controls.Add(btn);
            
        }

        void HandleBtnClick (object sender, EventArgs e)
        {
            combo.Sorted = true;
            
            combo.Items.Add("c");
        }
        
        
    }
}




ボタンを押すとSortedをtrueに変更し、さらにデータを追加しています。


実行直後は以下の並びですが、
30_011.png

ボタンを押すとソートされます。
また、プロパティ変更後に追加した値も追加した時点でソートされます。
30_012.png




ソートの指定はできますが、並びは一律昇順(asc)で降順(desc)の指定は行えないようです。
何か手はないか調べてみると、

http://bytes.com/topic/c-sharp/answers/453993-sort-combobox


ArrayList list = ArrayList.Adapter(comboBox1.Items);
list.Reverse();


というヒントがありました。

ComboBoxのItemsを一旦Listとして取得し、リストにあるReverseメソッドで降順にソートしてしまおうというわけです。


サンプルは以下のとおり。


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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        ComboBox combo;
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //一括でコンボボックスにデータを追加する
            combo.Items.AddRange(new String[]{"a", "b", "x", "y", "z"});
            this.Controls.Add(combo);
            
            Button btn = new Button();
            btn.Location = new Point(50, 100);
            btn.Text = "クリック";
            btn.Click += HandleBtnClick;
            this.Controls.Add(btn);
            
        }

        void HandleBtnClick (object sender, EventArgs e)
        {
            ArrayList list = ArrayList.Adapter(combo.Items);
            list.Reverse();
            combo.Items.Add("c");
        }
        
        
    }
}




起動時の状態は以下のとおり。
30_013.png

ボタンを押すと、降順に並び替えられます。
30_014.png

ただし、当たり前なのですがSortedプロパティをtrueにする場合と異なり、
ソート後に追加した項目はソートされません。
項目を追加する都度、同じロジックを実行してやる必要があります。





アイテムにオブジェクトを設定する



ComboBox.Items.Addの引数はobjectなので、自分で作成したオブジェクトも登録することができます。
コンボボックスに表示する文字列は、ToString()で取得できる文字列なので、
ToString()を適切にオーバーライドしてやれば、表示も問題ありません。

以下、都道府県に個別のコードを付与したオブジェクトを表示に使用する例です。


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

namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        ComboBox combo;
        
        public Form1()
        {
            this.Width = 250;
            this.Height = 300;
            this.Text = "サンプル";
            
            combo = new ComboBox();
            combo.Location = new Point(50, 50);
            
            //コンボボックスに自作クラスをデータとして追加する
            ComboData data;
            data = new ComboData("北海道", 11);
            combo.Items.Add(data);
            
            data = new ComboData("青森", 21);
            combo.Items.Add(data);
            
            data = new ComboData("秋田", 22);
            combo.Items.Add(data);
            
            data = new ComboData("岩手", 23);
            combo.Items.Add(data);
            
            this.Controls.Add(combo);
            
            Button btn = new Button();
            btn.Location = new Point(50, 100);
            btn.Text = "クリック";
            btn.Click += HandleBtnClick;
            this.Controls.Add(btn);
            
        }

        void HandleBtnClick (object sender, EventArgs e)
        {
            ComboData data = (ComboData)combo.SelectedItem;
            MessageBox.Show(data.ToString() + "が選択されていて、このコードは" + data.GetCode());
        }
    }
    
    class ComboData
    {
        private String name;
        private int code;
        public ComboData(String name, int code)
        {
            this.name = name;
            this.code = code;
        }
        
        public override string ToString ()
        {
            return name;
        }
        public int GetCode()
        {
            return code;
        }
    }
}






30_015.png






【参考URL】
http://www.apfield.jp/csgarden/combobox.html
http://www.labasp.net/CsharpNote/mControl/ComboBox/101_110.html





関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/06/05(日) 16:48:41|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu で ファミコン(NES)プログラム その1(開発環境作成とエミュレーター) | ホーム | C# 画像やパネルのドラッグ&ドロップ  [Ubuntu 11.04 + Mono]>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/784-c9f0ef18
この記事にトラックバックする(FC2ブログユーザー)