3

我有一个包含以下代码的组合框:

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, ICollection, IEnumerable),看看您是否可以自制一些模板化为键/值结构的东西。

于 2013-01-18T19:56:57.213 回答
1

当您构建您的 时,也为名称、ID 对AutoCompleteStringCollection构建一个。Dictionary<String, int>然后使用一些事件(文本框验证或用户提交/保存点击)来查找和设置 id。您可以将字典存储在文本框上Tag

编辑

出于某种原因,我认为您正在使用文本框控件。忘掉AutoCompleteStringCollection并建立一个Dictionary<String, int>. 对于组合框,将您的自动完成源设置为 ListItems,设置组合框的显示名称和值,并将数据源设置为字典。

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

但是,您应该只在用户在组合框中输入 n 个字符时填充数据源并自动完成一次,否则会出现错误。我曾尝试将其用于动态自动完成一次(例如,如果用户清除文本并重新键入,则列表会清除),但我不得不忘记组合框并使用类似于此用户的混合文本框列表框方法

于 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 回答