先頭の文字列を入力しても ComboBox コントロールの項目が選択されない

この資料では、マイクロソフトのベータ版製品について説明しています。この資料の情報は、この資料の発行時点のものであり、将来予告なしに変更することがあります。


このベータ版製品は、マイクロソフトの正規サポート対象外となっています。ベータ版のサポートについては、ベータ版製品に含まれるドキュメントを参照してください。または、ベータ版製品をダウンロードした Web サイトを参照してください。

現象

ComboBox コントロールの DropDownStyle プロパティを DropDownList に設定してから、実行時に ComboBox に項目の先頭の文字列を入力しても、ComboBox で選択される項目が入力した文字列と一致しません。ComboBox の項目は入力した最後の文字に基づいて選択されます。たとえば、ComboBox の項目が、[red]、[oak]、[rose] である場合、ComboBox に ro と入力すると、[rose] ではなく [oak] にフォーカスが設定されます。

原因

この問題は、ComboBox の検索が文字列全体ではなく、単一の文字に基づいて行われるために発生します。

回避策

この問題を回避するには、ComboBox に入力したすべての文字が含まれる項目の検索を行うコードを追加します。このコードでは、文字列全体と一致率の高い項目の選択も行う必要があります。定期的に検索テキストを消去するには、Timer コントロールを使用します。これを行うには、次の手順を実行します。
  1. Microsoft Visual Studio .NET または Microsoft Visual Studio 2005 を実行します。Visual Basic .NET、Visual Basic 2005、または Visual C# .NET を使用して新しい Microsoft Windows アプリケーションを作成します。


    デフォルトで Form1 が作成されます。
  2. ツールボックスから、Timer コントロールを Form1 にドラッグします。
  3. [プロパティ] ウィンドウで、Enabled プロパティを True に設定します。
  4. 次のステートメントをコードの変数宣言セクションに追加します。


    Visual Basic .NET または Visual Basic 2005
    Dim searchstr As String
    Visual C# .NET
    string searchstr;
  5. 次のコードを Form1 の Load イベントに追加します。


    Visual Basic .NET または Visual Basic 2005
    'set the timer interval and start the timer
    Timer1.Interval = 1000
    Timer1.Start()
    Visual C# .NET
    //set the interval  and start the timer
    timer1.Interval =1000;
    timer1.Start();
  6. 次のコードを Timer1 の Tick イベントに追加します。


    Visual Basic .NET または Visual Basic 2005
    'empty the string for every 1 seconds
    searchstr = ""
    Visual C# .NET
    //empty the string for every 1 seconds
    searchstr="";
  7. 次のコードを ComboBox1 の KeyUp イベントに追加します。


    Visual Basic .NET または Visual Basic 2005
          searchstr = searchstr & Chr(e.KeyValue)
    ' If the Search string is greater than 1 then use custom logic
    If searchstr.Length > 1 Then
    Dim index As Integer
    ' Search the Item that matches the string typed
    index = ComboBox1.FindString(searchstr)
    ' Select the Item in the Combo
    ComboBox1.SelectedIndex = index
    End If
    Visual C# .NET
             searchstr = searchstr + Convert.ToChar(e.KeyCode);
    // If the Search string is greater than 1 then use custom logic
    if (searchstr.Length > 1)
    {
    int index;
    // Search the Item that matches the string typed
    index=comboBox1.FindString(searchstr);
    // Select the Item in the Combo
    comboBox1.SelectedIndex=index;
    }

状況

この動作は仕様です。

詳細

現象の再現手順

  1. Microsoft Visual Studio .NET または Microsoft Visual Studio 2005 を実行します。Visual Basic .NET、Visual Basic 2005、または Visual C# .NET を使用して新しい Microsoft Windows アプリケーションを作成します。


    デフォルトで Form1 が作成されます。

    : Visual Basic 2005 では、コードを変更する必要があります。Windows フォーム プロジェクトを作成すると、デフォルトでプロジェクト用のファイルが 2 つ作成されます。フォームの名前が Form1 の場合、フォームを表すこの 2 ファイルの名前は Form1.vb および Form1.Designer.vb です。ユーザーによるコードの記述は Form1.vb ファイルで行います。Form1.Designer.vb ファイルには、Windows フォーム デザイナによってコードが記述されます。Windows フォーム デザイナは、Partial キーワードを使用して、Form1 を 2 つの異なるファイルに分けて実装します。この動作により、Windows フォーム デザイナが生成したコードが、ユーザーが記述したコード内に散在することがなくなります。


    Visual Basic 2005 の新しい言語機能強化の詳細については、以下の MSDN (Microsoft Developer Network) Web サイトを参照してください。

    部分クラスおよび Windows フォーム デザイナの詳細については、次のマイクロソフト Web サイトを参照してください。

  2. ツールボックスから、ComboBox コントロールを Form1 にドラッグします。
  3. [ComboBox1] を右クリックし、[プロパティ] をクリックします。
  4. [プロパティ] ウィンドウで、[DropDownStyle] をクリックし、このプロパティを DropDownList に設定します。
  5. [プロパティ] ウィンドウで、[Items] をクリックし、省略記号ボタン ([...]) をクリックします。
  6. [文字列コレクション エディタ] で、行を分けてそれぞれ redoakrose と入力し、[OK] をクリックします。
  7. [デバッグ] メニューの [開始] をクリックして、アプリケーションを実行します。
  8. [ComboBox1] に ro と入力します。

関連情報

関連情報について参照するには、次の MSDN Web サイトにアクセスしてください。


ComboBox.DropDownStyle プロパティ

http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsComboBoxClassDropDownStyleTopic.asp
プロパティ

文書番号:814362 - 最終更新日: 2008/04/29 - リビジョン: 1

フィードバック