文本框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之间的连接?

文本框AutoCompleteSource (winForms)和LINQ查询

我在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有可能在查询中出现两次。