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);
}
}
}
実行結果は以下のとおり。

表示スタイルの変更はDropDownStyle
コンボボックスの表示スタイルは、DropDownStyleで変更できます。
指定できるのは、以下のとおり。
ComboBoxStyle.DropDown (デフォルト。編集可能コンボボックス)
ComboBoxStyle.DropDownList (編集不可能コンボボックス)
ComboBoxStyle.Simple (リスト部分を常に表示)
各々、コードと画面の比較はこんな感じ。
combo.DropDownStyle = ComboBoxStyle.DropDown;

combo.DropDownStyle = ComboBoxStyle.DropDownList;

combo.DropDownStyle = ComboBoxStyle.Simple;

初期値の設定はSelectedIndex
SelectedIndexを使用すると、選択状態となる項目を変更できます。
combo.SelectedIndex = 2;
というコードを追加すると、「秋田」が選択された状態となります。

項目の一括設定は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」が自動補完されます。

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

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

「P」という入力に対して「Perl」と「Python」2つの候補が表示されました。
最後に
combo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
としてみます。

「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 + "を選択");
}
}
}

コンボボックス内のデータのソート
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に変更し、さらにデータを追加しています。
実行直後は以下の並びですが、

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

ソートの指定はできますが、並びは一律昇順(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");
}
}
}
起動時の状態は以下のとおり。

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

ただし、当たり前なのですが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;
}
}
}

【参考URL】
http://www.apfield.jp/csgarden/combobox.htmlhttp://www.labasp.net/CsharpNote/mControl/ComboBox/101_110.html- 関連記事
テーマ:プログラミング - ジャンル:コンピュータ
- 2011/06/05(日) 16:48:41|
- 備忘録
-
| トラックバック:0
-
| コメント:0