コントロールを使って見る記事、もう少し続きます。
今回はListBoxとComboBoxです。
コントロールはユーザーインタフェースとして、ソフトウエアを使う人がソフトウエアに対して情報を入力したり、ソフトウエアから情報を得る為の手段です。
つまり、プログラム全体からすると、入口と出口を司る機能でしかないので、あまり深入りする必要はないと考えています。しかし、使い方を知らないと使えないと言うのも又事実なので、淡々と、「こういう物だ」という感覚を持って、慣れていく程度の捉え方で良いと思います。
ListBox
リストボックスは、リストを使って、予め用意された選択肢の中から選択するGUIです。非常に良く使われています。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace MyFrmApp
{
public class MyForm : Form
{
private Label label; // Labelクラス型の変数を定義
ListBox list; // ListBoxクラス型の変数を定義
public MyForm()
{
this.Width = 300; // MyFormの幅を300ピクセルに設定
this.Height = 200; // MyFormの高さを200ピクセルに設定
setupControls(); // MyFormに配置されるコントロールの設定
}
public void setupControls()
{
label = new Label(); // Labelクラスのインスタンスを生成し、labelに格納
label.Text = "type text:";
label.Font = new Font("Geneva", 12, FontStyle.Regular);
label.Height = 30;
label.Width = 300;
this.Controls.Add(label);
list = new ListBox(); // ListBoxクラスのインスタンスを生成し、listに格納
list.Width = 100; // listの幅を設定
list.Height = 100; // listの高さを設定
list.Left = 50; // listを設置するMyForm内の座標(左上)
list.Top = 50; // 同上
list.SelectionMode = SelectionMode.MultiExtended; // ListBoxの動作設定(複数選択可)
list.Items.Add("Hello"); // 選択肢を追加
list.Items.Add("Welcome"); // 選択肢を追加
list.Items.Add("Bye"); // 選択肢を追加
list.SelectedValueChanged += list_changed; // イベントハンドラの登録
this.Controls.Add(list);
}
private void list_changed(object sender, System.EventArgs e)
{
string res = "selectel: ";
// foreachで選択されている項目を全部拾い上げる
foreach (string obj in list.SelectedItems)
{
res += obj + " ";
}
label.Text = res; // labelに連結した文字列を設定
}
}
}
起動すると、下のようなリストボックスが現れます。
リストの中から何かを選択すると、リストボックスの状態が変化した事によるイベントが発生し、下のように選択されている項目がMyForm上のラベル(変数名label)に設定されます。
複数選択した場合は下のようになります。
さらに、全部選択した場合、下のように全ての項目が抽出されます。
ComboBox
リストボックスと同様によく使われるGUIの仕組みですが、ドロップダウンリストまたはリストボックスを1行のテキストボックスと組み合わせたもので、使う人は値を直接入力することもできるし、ドロップダウンリストに定義された選択肢から選ぶこともできる作りになっています。
リスト1 MyForm.cs
Mainメソッドを記述したmain.csは前回のものがそのまま使えるので、割愛します。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace MyFrmApp
{
public class MyForm : Form
{
private Label label; // Labelクラス型の変数を定義
ComboBox combo; // ComboBox型の変数を定義
public MyForm() // コンストラクタ
{
this.Width = 300; // MyFormの幅を300ピクセルに設定
this.Height = 200; // MyFormの高さを200ピクセルに設定
setupControls(); // MyFormに配置するコントロールの設定
}
public void setupControls()
{
label = new Label(); // Labelのインスタンス生成
label.Text = "type text:";
label.Font = new Font("Geneva", 12, FontStyle.Regular);
label.Height = 30;
label.Width = 300;
this.Controls.Add(label); // labelをMyFormに設置
combo = new ComboBox(); // ComboBoxのインスタンスを生成
combo.Items.Add("Windows"); // comboのメニュー項目追加
combo.Items.Add("Mac OS X"); // comboのメニュー項目追加
combo.Items.Add("Linux"); // comboのメニュー項目追加
combo.Width = 100;
combo.Height = 25;
combo.Left = 50;
combo.Top = 50;
// comboのイベントハンドラ設定(値が変わったとき)
combo.SelectedValueChanged += combo_changed;
// comboのイベントハンドラ設定(テキストが変わったとき)
combo.TextChanged += combo_changed;
this.Controls.Add(combo); // comboをMyFormに設置
}
private void combo_changed(object sender, System.EventArgs e) // イベント処理本体
{
int n = combo.SelectedIndex; // 何番目の要素が選ばれたかを保持
string str = combo.Text; // ComboBoxの持つテキストを保持
// イベントが発生したとき、何が選ばれているかを
// MyFormのlabelに設定、表示する
label.Text = "selected: " + n + "(" + str + ")";
}
}
}
起動すると、このようなウインドウが表示されます。この状態では何も選択されていません。
プルダウンメニューを開くと、このような内容です。
何かを選択すると、選択したアイテムのインデックス番号(プログラムで定義した選択肢の0から始まる順番)と、選択したアイテムがlabelに表示されます。下は、一番最初に追加したWindowsです。
次は2番目に追加したMax OS Xです。
次が3番目に追加したLinuxです。
予め用意した選択肢ではないものを入力すると、インデックス番号が-1となって、入力した文字列が表示されます。
プログラムを見て頂くとおわかり頂けると思いますが、こういうコントロールを扱うプログラムは、オブジェクトのプロパティをいじったり、オブジェクトが持っているメソッドを呼び出したり、という操作がほとんどを占めます。
コントロールの使い方をマニュアルで調べれば、やりたいことはほとんど出来てしまうと思います。
それにしても少ないコード量でやりたいことができるのがC#と.NET Frameworkの良いところですね。Mac環境でのGUIはまだ研究していませんが、今後やっていきたいと思っています。
今回はこれで終わりです。