带有键/值对的ComboBox自动完成

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。
谢谢。
3个回答

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;
}

使用这个示例,您将不会遇到像上面的示例中那样的重复字符串问题。

1

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

编辑

由于某种原因,我以为您正在使用文本框控件。忘记AutoCompleteStringCollection,只需构建Dictionary<String, int>。对于组合框,将其自动完成源设置为ListItems,设置组合框显示名称和值,并将数据源设置为字典。

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

然而,只有在用户在组合框中输入n个字符时才应填充数据源和自动完成,否则它会出现错误。我曾尝试将其用于动态自动完成(例如,如果用户清除文本并重新输入,则列表会清除),但我不得不放弃组合框并使用类似于user的混合文本框列表框方法。


如果我理解正确,您的意思是有两个集合:一个是字典,另一个是AutoCompleteStringCollection?那么如何将这两个匹配以查找ID呢?由于可能存在重复的医生姓名(例如“John Smith”),所以这可能会导致另一个问题,因为用户将永远不知道该选择哪一个。嗯... - Adam Plocher
没错。是的,需要唯一的字符串。无论是对于字典还是对于您的用户来识别正确的医生,都是必要的。 - user1914530

1

看起来你的问题是AutoCompleteStringComplete是专门为字符串设计的(因此,名称中包含字符串)。

你可能想要研究一下父类(IListICollectionIEnumerable),看看是否可以自己制作一个针对键/值结构的模板。


谢谢您的回复。我尝试了一个 List<KeyValuePair<int, string>>,当我设置 AutoCompleteCustomSource 时,会出现无法转换的错误。如果我尝试显式转换它,在运行时会抛出异常。我想我可能只需要将医生的 NPI 号码添加到字符串中,这样它就可以显示为 "Doh, John (#11111)" 并使用正则表达式解析该数字。很糟糕。非常感谢! - Adam Plocher
很高兴能够帮到你!需要解析字符串并不是最糟糕的事情。您甚至可以使用String.Split()函数 http://msdn.microsoft.com/en-us/library/system.string.split(v=vs.110).aspx - Joseph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接