2011-11-15 14 views
2

コンボボックスのデータソースを設定するプロジェクトがありますが、ユーザーはこのリストから何かを選択するか、リストに含まれていないアイテムを入力できます。基本的には、通りを含むジオバースがありますが、ユーザーはリストからストリートを選択する必要はありません。 ComboBox.DropDownStyleはDropDownに設定されています。コンボボックスがデータソースに結びついているときにコンボボックスを使用する

ジオバースに含まれていない通り(したがって、ComboBox.DataSourceに含まれていない)の道路を含むレコードを編集すると、フォームに正しく入力する問題が発生しています。ここで

は、我々の問題の非常に簡略化された形式である:ComboBoxTrialクラスは、このようなものになり

private void button1_Click(object sender, EventArgs e) 
    { 
     // Create a new form. In the constructor the DataSource of the ComboBox is set with three items: 
     //  Main St., First St., and Second St. 
     ComboBoxTrialForm frm = new ComboBoxTrialForm(); 

     // Set comboBox1.Text equal to an item NOT in the datasource 
     frm.SetComboTextValue("Michigan Ave."); 

     // Show the form, and the comboBox has the first item in its datasource selected 
     frm.Show(); 
    } 

public partial class ComboBoxTrialForm : Form 
{ 
    public ComboBoxTrialForm() 
    { 
     InitializeComponent(); 
     List<string> streets = new List<string>() { "Main St.", "First St.", "Second St." }; 
     comboBox1.DataSource = streets; 
    } 

    public void SetComboTextValue(string text) 
    { 
     comboBox1.Text = text; 
    } 
} 

を私はポイントを壊す設定し、comboBox1.Textが実際にセットされますないことがわかりました正しく興味深いことに、この簡単な例でBindingContextChangedイベントが実際に2回発生することがわかりました。 comboBox1.DataSource = streetsが呼び出されるとコンストラクタに1回、frm.Show()が呼び出されると2回目です。

フォームが表示されているときにこのイベントが発生するのはなぜですか。手動で選択された選択が削除されるのはなぜですか。この行動を修正するにはどうすればよいですか?

また、私はこの方法でコンボボックスを使用できるはずがないと思っていますか?

ありがとうございます。

答えて

3

あなたがにSelectedIndexを設定することができるはず-1無いように、アイテムがリスト内で選択されています。私は「ミシガン・アベニュー」には何の問題もなかった。このメソッドでコンボボックスに表示します。

public Form1() 
{ 
    InitializeComponent(); 
    comboBox1.DataSource = new List<string>() { "Main St.", "First St.", "Second St." }; 
    comboBox1.SelectedIndex = -1; 
} 

また、フォームを表示してテキストを設定することもできます。それが問題でない限り、ユーザーはおそらく気付かないでしょう。

frm.Show(); 
    frm.SetComboTextValue("Michigan Ave."); 
+0

ありがとうブライアン。私はあなたが私の問題を検討し、解決策を提供するのにかかった時間を本当に感謝します。 [MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.text.aspx)は、次のように説明しています。 "Textプロパティをコレクションにない値に設定すると、 SelectedIndexは変更されません。私は、コンボボックスの値をリストにない値に設定すると、selectedIndexは0のままになると思います。フォーム/コンボボックスが表示されているとき、現在のselectedIndexと等しい値を設定して、選択範囲を消去します。それは正しいと思いますか? –

+0

また、BindingContextChangedイベントが2回発生する理由も考えられます。私はなぜそれが最初に発火するのか理解していますが、フォームが表示されたときになぜ再び発火するのか分かりません。 –

0

コンボボックスの代わりに、ユーザーがテキストボックスに入力するときに呼び出されるWCF Windowsサービスを使用しないでください。そのようにテキストボックスを使用しますが、まだユーザーにこれがWindowsサービス

http://wcftutorial.net/WCF-Windows-Service-Hosting.aspx

http://msdn.microsoft.com/en-us/library/bb332338.aspx

のためにあなたのコードを与える必要があります

データベースから類似したものを選択する能力を与えることができます

そして、あなたはそれをkeyupイベントから呼び出すことができます。

+0

これはASP.NET用のものと思われます。このプロジェクトではwinformsを使用しています。 –

+0

私はwinformsアプリでajaxを使用することが可能ですか?..... –

+0

@errorstacksごめんなさい。アドレスのリストを提供するWCFサービスでも同じことが達成できます。 – Sico

1

winformsコードでコンストラクタ内のデータソースを設定するインスタンスは考えられないので、実際に何を見ているのかは分かりません。

ただし、私は、このような問題を避けるために、常にこのような問題をどのように処理するかを伝えることができます。フォームに使用するパラメータを受け入れるメソッドを作成し、フォーム自体を表示してから、フィールド値を設定します。

何年も前にこのパターンを開始したのは、自分自身をリセットしたり、フォームが実際に表示されるまで無効な状態だったサードパーティのコントロールを扱っていたときでした。

このパターンは、何らかの理由でフォームが表示されるべきではないと判断した場合にも非常に役立ちます(同じタイプの別のフォームが開いていて、フォームで使用されているリソースにアクセスする際にエラーが発生しました。適切な権限を持っているかなど)。

パターンは、標準の組み込みモーダルダイアログ値よりもモーダルダイアログからより有用な値を返す場合にも便利です。

次のようにあなたのケースでは、我々はあなたのフォームを書き換えますが:

public partial class ComboBoxTrialForm : Form 
{ 
    public ComboBoxTrialForm() 
    { 
     InitializeComponent(); 
    } 

    public void ShowForm(string comboBoxValue) 
    { 
     this.Show(); 

     List<string> streets = new List<string>() { "Main St.", "First St.", "Second St." }; 
     comboBox1.DataSource = streets; 

     SetComboTextValue(comboBoxValue); 
    } 

    public void SetComboTextValue(string text) 
    { 
     comboBox1.Text = text; 
    } 
} 

あなたのButton1_Clickイベント、その後は次のようになります。

private void button1_Click(object sender, EventArgs e) 
{ 
    // Create a new form. In the constructor the DataSource of the ComboBox is set with three items: 
    //  Main St., First St., and Second St. 
    ComboBoxTrialForm frm = new ComboBoxTrialForm(); 

    // Show the form, and the comboBox has the first item in its datasource selected 
    frm.ShowForm("Michigan Ave."); 
} 
+0

この回答をまとめて、問題を検討する時間を割いてくれてありがとう。これは有用なパターンであり、確かに私の問題を解決するだろう。私は@Bryan Crosbyが正しい答えを持っていることをマークしています。なぜなら、私たちのコードベースにはほとんど変更を加える必要がないからです。フォームがロードされると、多くのことが起こっているようです。 –

関連する問題