2

私は未亡人のc#.netでプロジェクトを開発しています。フォームでは、8つ以上のコンボボックスコントロールがあります。以下のようにcombobox1の選択を変更した場合、combobox2にデータをロードします。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
     comboBox2.DataSource = DataTable;
     comboBox2.DisplayMember="Name";
     comboBox2.ValueMember = "ID";
}

以下のようにcombobox2を選択すると、Combobox3が読み込まれます。

 private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
 {
     comboBox3.DataSource = DataTable;
     comboBox3.DisplayMember = "Age";
     comboBox3.ValueMember = "AgeCode";
 }

私のように、コンボボックスの残りの部分にデータをロードします。ここでの問題は、 comboBox2がロードされているかどうかをメソッド
でチェックインしなかった場合にエラーが発生することです。comboBox1_SelectedIndexChanged

ブール変数を使用してこれを確認できることは知っていますが、恐ろしいことに、残りのすべてのメソッドで「true/false」状態を維持する必要があります。

簡単な方法でこれを修正しようと思ったのは、Add(combobox, Methodname)メソッドとメソッドを使用して、コンボボックスイベントに関数Remove(combobox, method)を追加および削除することです。comboBox_SelectedIndexChangedSelectedIndexChanged

しかし、メソッドをパラメーターとして渡すことができませんでした。誰かが私の要件のパラメータとしてメソッドを渡す方法を教えてもらえますか?

4

3 に答える 3

3

意図した場合はmethodパラメーターAddとメソッドで、および/またはソリューションはRemovecomboBox1_SelectedIndexChangedcomboBox2_SelectedIndexChanged

private void Add(ListControl dropDownList, EventHandler handlerMethodName)
{
   dropDownList.OnSelectedIndexChanged += handlerMethodName;
   //some logic here
}

private void Remove(ListControl dropDownList, EventHandler handlerMethodName)
{
   dropDownList.OnSelectedIndexChanged -= handlerMethodName;
   //some logic here
}

ご注意: にあり、DropDownListアプリケーション用です。ASP.NETComboBoxWinForms

詳細については、 MSDN - DropDownListおよびMSDN - ListControl.SelectedIndexChanged イベントを参照してください。

于 2013-03-18T11:26:49.027 に答える
1

あなたが何をしようとしているのかわからない。しかし、なぜ ComboBox とメソッドの辞書ではないのでしょうか?

このような:

var dict = Dictionary<ComboBox, Action<object, EventArgs>>();

private void Add(ComboBox c, Action<object, EventArgs>e) {
   dict[c] = e;
}

private void Remove(ComboBox c, Action<object, EventArgs> e) {
   dict.Remove(c);
}

そして、::を呼び出す

private void CallHandler(ComboBox c, EventArgs e)
{
   dict[c](c, e);
}

あるいは

private void AddHandler(ComboBox c, Action<object, EventArgs> e)
{
   c.SelectedIndexChanged += e;
}

private void RemoveHandler(ComboBox c, Action<object, EventArgs> e)
{
   c.SelectedIndexChanged -= e;
}
于 2013-03-18T11:14:27.823 に答える
1

また、あなたが探しているソリューションの種類について 100% 確信があるわけではありませんが、あなたの必要性についての私の理解は次の方法です。

public void Add(DropDownList combo, EventHandler method)
{
    combo.SelectedIndexChanged += method;
}

public void Remove(DropDownList combo, EventHandler method)
{
    combo.SelectedIndexChanged -= method;
}

EventHandlerこれで、デリゲートと同じシグネチャを持つ独自のメソッドを定義できます。

public void MyMethod1(object sender, EventArgs e)
{}

また、上記で定義されたメソッドを呼び出すことで、メソッドを登録および登録解除できます。

DropDownList lst = new DropDownList();
Add(lst, MyMethod1);
Remove(lst, MyMethod1);

ただし、これは問題の最適な解決策ではない可能性があることに注意してください。

于 2013-03-18T11:27:09.560 に答える