我有一个带有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之间的连接?
答案 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可能会在查询中出现两次。