2017-03-17 2 views
2

私はc#を初めて使用しました。いくつかのフォームアクションに基づいてイベントをトリガする方法を学習しています。C#Winforms:選択したアイテムに基づいてComboBoxにテキストを設定します。

これは、ビューの一部です:

private void comboGoodsName_TextChanged(object sender, EventArgs e) 
{ 
    controller.selectName(comboGoodsName.Text); 
} 

public void nameChanged(object sender, MeasurementEventArgs e) 
{ 
    comboGoodsName.TextChanged -= comboGoodsName_TextChanged; 
    comboGoodsName.Text = e.value; 
    comboGoodsName.TextChanged += comboGoodsName_TextChanged; 
} 

そして、これは、コントローラの一部です:

public void selectName(string name) 
{   
    model.Name = name.Split('|')[0].Trim(); 

    if (name.Contains(" | ")) 
    { 
     string code = name.Split('|')[1].Trim(); 
     model.NameCode = code; 
    } 
} 

次のようなシナリオは次のとおりです。
私はそれにいくつかの項目でComboBoxを持ちたいです(ソースが何であるかは関係ありません)。項目は、名前とコードを組み合わせた形式(NAME | CODE)です。 ComboBoxにテキストを入力すると、comboGoodsName_TextChangedが呼び出され、モデルのプロパティを設定するselectNameが呼び出され、その結果、nameChangedというイベントが発生します。これは正常に動作します(NAMEComboBoxCODETextBoxとしています)。 ComboBoxドロップダウンリストから項目を選択すると問題が表示されます。項目を選択すると、がComboBoxに表示されるのではなく、NAME | CODEと表示されます。

編集:モデルでは、プロパティが正しく設定されていますが、値を印刷して確認しました。したがって、問題は適切な値をComboBoxに表示することと関連しています。

+0

あなたの条件を理解しようとしています。あなたはコンボボックスでCODEを見たいと思っていますか? ComboBoxプロパティを使用しないのであれば、** CODE **の** NAME **と* ValueMember *には* DisplayMember *を使用してください。 –

+0

はい、私はそれを表示したいので、ユーザーは異なる項目を区別することができます。また、ユーザーが項目を選択すると、1つの情報がコンボボックスに送られ、別の情報がテキストボックスに送られます。 – Fejs

+0

何がトリガーされますか?** nameChanged()**? –

答えて

1

これを試してみてください:

private void comboGoodsName_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // if combobox has selected item then continue 
    if (comboGoodsName.SelectedIndex > -1) 
    { 
     // split the selecteditem text on the pipe into a string array then pull the first element in the array i.e. NAME 
     string nameOnly = comboGoodsName.GetItemText(this.comboGoodsName.SelectedItem).Split('|')[0]; 

     // handing off the reset of the combobox selected value to a delegate method - using methodinvoker on the forms main thread is an efficient to do this 
     // see https://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker(v=vs.110).aspx 
     this.BeginInvoke((MethodInvoker)delegate { this.comboGoodsName.Text = nameOnly; }); 
    }  
} 
+0

私は初心者ですから、これは何をするのですか?ところで、今は期待どおりに働いています。 – Fejs

+0

コードにコメントが追加されました。 –

関連する問題