3

次のコードのComboBoxがあります。

private void comboBox1_TextChanged(object sender, EventArgs e)
{
    using (var service = WebServiceHelper.GetCoreService())
    {
        string physicianXml = service.SearchPhysicians(SessionInfo.Current.ClientCode, SessionInfo.Current.MachineName,
                                    SessionInfo.Current.Username, comboBox1.Text);

        var physicians = PhysicianItemList.FromXml(physicianXml);

        AutoCompleteStringCollection autoCompleteStringCollection = new AutoCompleteStringCollection();
        foreach (var physician in physicians.Items)
        {
            autoCompleteStringCollection.Add(physician.LastName + ", " + physician.FirstName);
        }

        comboBox1.AutoCompleteCustomSource = autoCompleteStringCollection;
        comboBox1.Select(comboBox1.Text.Length, 0);
    }
}

基本的に、ユーザーは医師の名前の最初の数文字を入力し、オートコンプリートリストに一致する上位100件のレコードを入力する必要があります。これはうまく機能しますが、キー(テーブルのPKまたは医師のNPI番号)に関連付ける必要があります。AutoCompleteStringCollectionキーをサポートしていないようです。誰かがこれを行う方法を提案できますか?テーブルには約700万のレコードがあるため、ComboBoxに事前入力したくありません。

ありがとう

4

3 に答える 3

1

あなたの問題は、AutoCompleteStringCompleteが文字列(したがって名前)のために特別に作成されたということのようです。

親(IList、、 )を調べてICollectionIEnumerableキー/値構造体に向けてテンプレート化されたものを自作できるかどうかを確認することをお勧めします。

于 2013-01-18T19:56:57.213 に答える
1

を作成するときAutoCompleteStringCollectionDictionary<String, int>、名前とIDのペアも作成します。次に、いくつかのイベント(テキストボックスの検証またはユーザーの送信/保存クリック)を使用して、IDを検索および設定します。辞書をテキストボックスに保存できTagます。

編集

何らかの理由で、テキストボックスコントロールを使用していると思いました。を忘れて、AutoCompleteStringCollectionビルドするだけDictionary<String, int>です。コンボボックスの場合は、autocompletesourceをListItemsに設定し、コンボボックスの表示名と値を設定して、データソースをディクショナリに設定します。

combobox.DisplayMember = "key";
combobox.ValueMember = "value";
combobox.AutocompleteSource = AutocompleteSource.ListItems;
combobox.DataSource = myDictionary;

ただし、ユーザーがコンボボックスにn文字を入力したときに、データソースにデータを入力してオートコンプリートを1回だけ行う必要があります。そうしないと、バグが発生します。これを動的オートコンプリートに一度使用しようとしました(たとえば、ユーザーがテキストをクリアして再入力するとリストがクリアされます)が、コンボボックスを忘れて、このユーザーと同じようにハイブリッドテキストボックスリストボックスアプローチを使用する必要がありました

于 2013-01-18T20:16:08.410 に答える
1

手遅れですが、誰かがこのコードを使用する可能性があります:

this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;

RNProveedor rnProveedor = new RNProveedor();
var listaProveedores = rnProveedor.Buscar();
Dictionary<int, String> dicTemp = new Dictionary<int, string>();

foreach (var entidad in listaProveedores)
{
    dicTemp.Add(entidad.ProvNro, entidad.ProNombre);
}

this.DataSource = new BindingSource(dicTemp, null);
this.DisplayMember = "Value";
this.ValueMember = "Key";

そして値を選択するには

public int GetValorDecimal()
{
    KeyValuePair<int, string> objeto = (KeyValuePair<int, string>)this.SelectedItem;     
    return objeto.Key;
}

この例では、上記の例のように文字列が重複しても問題はありません。

于 2015-12-18T17:53:11.283 に答える