我有一个包含以下代码的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。
由于
答案 0 :(得分:1)
看起来你的问题是AutoCompleteStringComplete专门针对字符串(因此,名称)。
您可能需要查看父母(IList
,ICollection
,IEnumerable
)并查看是否可以将一些模板化的东西设置为键/值结构。
答案 1 :(得分:1)
当您构建AutoCompleteStringCollection
时,请为名称构建Dictionary<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个字符时,您应该只填充数据源并自动完成一次,否则会出错。我尝试将其用于动态自动完成一次(例如,如果用户清除文本和重新类型,列表会清除),但我不得不忘记组合框并使用混合文本框列表框方法,就像这样user
答案 2 :(得分: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;
}
通过这个例子,你不会像上面的例子那样对重复的字符串有任何问题