文本框AutoCompleteSource (winForms)和LINQ查询
本文关键字:LINQ 查询 winForms AutoCompleteSource 文本 | 更新日期: 2023-09-27 18:11:16
我有一个预先填充的文本框,带有AutoCompleteCustomSource:
var source = new AutoCompleteStringCollection();
using(propertiesManagementDataContext db = new propertiesManagementDataContext())
{
var q =
(from t in db.GetTable<Tenant>()
select t.lname + " " + t.fname).ToArray();
source.AddRange(q);
}
txt_callerName.AutoCompleteCustomSource = source;
txt_callerName.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
txt_callerName.AutoCompleteSource = AutoCompleteSource.CustomSource;
工作正常,但我想知道自动完成项目的ID。如何得到它?我尝试这样做,但有一个错误:
var q =
(from t in db.GetTable<Tenant>()
select new {lfname = t.lname + " " + t.fname, t.tenantID}).ToArray();
source.AddRange(q);
//this does not work, because q is not an array of strings anymore
如何自动完成文本框并保存自动完成项的Lname, Fname和tenantID之间的连接?
我在AutoCompleteStringCollection
类中没有看到任何允许您为每个字符串存储额外数据的内容…它基本上就是一个字符串的集合。
这并不理想,但您可以在字符串的末尾包含ID,这样在用户键入时不会影响自动完成体验,然后在用户进行选择时解析返回值:
var q =
(from t in db.GetTable<Tenant>()
select string.Format("{0} {1} ({2})", t.lname, t.fname, t.tenantID)).ToArray();
或者,您可以使用ComboBox
控件,它(当配置正确时)完成TextBox
正在做的一切,并支持将数据源设置为您想要的任何类的集合(不限于字符串集合)。
然后使用DisplayMember
指定用户可见的属性(名称),然后使用ValueMember
指定每个项目的值(ID)。
您可以将所有额外的数据存储在并行字典(或其他类似的集合)
var q =
(from t in db.GetTable<Tenant>()
select new {lfname = t.lname + " " + t.fname, t.tenantID});
Dictionary<String, Int32> idDictionary = new Dictionary<String, Int32>();
foreach(var item in q)
{
idDictionary.Add(item.lfname, item.tenantID);
source.AddRange(q);
}
...
String currentSuggestion = ...
Int32 id = idDictionary[currentSuggestion];
dbContext.Entities.RemoveById(id);
这不是理想的解决方案,因为您必须以某种方式将每个textBox与自动完成关联到自己的字典(要么并行存储,要么子类化textBox)。此外,lfname有可能在查询中出现两次。