文本框AutoCompleteSource(winForms)和LINQ查询

时间:2014-07-03 16:13:05

标签: c# winforms linq autocomplete

我有一个带有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之间的连接?

2 个答案:

答案 0 :(得分:0)

我在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)的值。

答案 1 :(得分:0)

您可以将所有其他数据存储在并行字典(或其他类似集合)

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与AutoCompletion关联它自己的字典(将它们并行存储,或者将TextBox子类化)。此外,lfname可能会在查询中出现两次。