良い解決策(一般的に言えば、特別な場合には最善の方法ではないかもしれませんが、それを判断するには、より多くの情報が必要です)は、単なる文字列ではなく、オブジェクトをComboBoxに格納するようです。これらのオブジェクトは、ComboBoxに表示されるテキストと、呼び出すメソッドを実行する方法を提供する必要があります。
SetOutputState
この例では、常にインスタンスのメソッドを呼び出しているように見えOutPort
ます(ここではクラス名を想定しています)。したがって、ComboBoxアイテムオブジェクトは次のようになります。
public class ComboItem
{
public ComboItem(string displayName, OutPort outPort)
{
this.displayName = displayName;
this.outPort = outPort;
}
private readonly string displayName;
private readonly OutPort outPort;
public override string ToString()
{
return displayName;
}
public OutPort OutPort {
get {
return outPort;
}
}
}
ToString
メソッドの結果は、ComboBoxでユーザーに表示される文字列になることに注意してください。
次のようにComboBoxに入力する必要があります。
cmb_Motor.Items.Add(new ComboItem("OutPortA", NXT_Brick.OutPortA);
cmb_Motor.Items.Add(new ComboItem("OutPortB", NXT_Brick.OutPortB);
cmb_Motor.Items.Add(new ComboItem("OutPortC", NXT_Brick.OutPortC);
次に、選択したアイテムを次のように評価できます。
ComboItem selectedItem = cmb_Motor.SelectedItem as ComboItem;
if (selectedItem != null) {
selectedItem.OutPort.SetOutputState();
}
選択したアイテムで実行する操作をさらに変更する必要がある場合は、実行するアクションもComboItem
クラスに移動します。
public class ComboItem
{
public ComboItem(string displayName, OutPort outPort)
{
this.displayName = displayName;
this.outPort = outPort;
}
private readonly string displayName;
private readonly OutPort outPort;
protected OutPort OutPort {
get {
return outPort;
}
}
public override string ToString()
{
return displayName;
}
public virtual void DoWork()
{
outPort.SetOutputState();
}
}
プロパティは、もうOutPort
公開する必要はありません。DoWork
選択したアイテムを呼び出すだけです。したがって、評価コードは次のように変更できます。
ComboItem selectedItem = cmb_Motor.SelectedItem as ComboItem;
if (selectedItem != null) {
selectedItem.DoWork();
}
別のアクションが必要な場合は、メソッドをComboItem
オーバーライドして別のことを行うために、そこから新しいクラスを派生させることができます。DoWork