是否可以从两个字段中获取autoCompleteStringCollection的值。我有一个包含字段Code和NameA的表,是否可以从这两个字段获取自动完成建议?我在Windows窗体中使用c#。
这是我的代码:
internal static System.Windows.Forms.AutoCompleteStringCollection getAutoCompleteSiteNames(out System.Windows.Forms.AutoCompleteStringCollection namesCollection)
{
try
{
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
string query = @"Select distinct [NameA] from [tblItem]";
SqlCeCommand com = new SqlCeCommand(query, con);
namesCollection = new System.Windows.Forms.AutoCompleteStringCollection();
SqlCeDataReader dr = com.ExecuteReader();
while (dr.Read())
namesCollection.Add(dr["NameA"].ToString());
}
catch (Exception)
{
throw new Exception();
}
finally
{
con.Close();
}
return namesCollection;
}
答案 0 :(得分:1)
我猜你的意思是
string query = @"Select distinct [NameA] from [tblItem] union
Select distinct [Code] from [tblItem] ";
答案 1 :(得分:0)
您可以使用这样的LINQ获取两个文本框的自动完成字符串的唯一匹配项:
var allStrings = textBox1.AutoCompleteCustomSource
.Cast<string>()
.Union(
textBox2.AutoCompleteCustomSource
.Cast<string>()
).ToList();
更新:您完全更改了问题,使之前的答案无效。
我会将任务分成两个不同的任务:
如果您有一个表示数据的类,而不是直接处理数据库,则可以更轻松地处理数据。创建一个表示数据的类
public class Item
{
public int ID { get; set; }
public string NameA { get; set; }
public string Code { get; set; }
// ... other properties go here
}
现在你可以阅读这样的项目了
public List<Item> GetAllItems()
{
var items = new List<Item>();
using (var con = new SqlCeConnection(connectionString))
using (var cmd = new new SqlCeCommand("Select * from tblItem", con))
{
conn.Open();
SqlCeDataReader dr = cmd.ExecuteReader();
int idOrdinal = dr.GetOrdinal("ID");
int nameAOrdinal = dr.GetOrdinal("NameA");
int codeOrdinal = dr.GetOrdinal("Code");
// other fields ...
while (dr.Read()) {
var item = new Item();
item.ID = dr.GetInt32(idOrdinal);
item.NameA = dr.GetString(nameAOrdinal);
item.Code = dr.GetString(codeOrdinal);
// other fields ...
items.Add(item);
}
}
return items;
}
如果您使用像实体框架这样的O / R映射器来自动完成此任务,那就更容易了。
现在,您可以使用一般方法返回可在各种情况下使用的项目。获取这些自动完成字符串只是其中之一。
List<Item> items = GetAllItems();
var autocompleteNames = items
.Select(i => i.NameA)
.Distinct()
.ToArray();
var autocompleteCodes = items
.Select(i => i.Code)
.Distinct()
.ToArray();
nameATextBox.AutoCompleteCustomSource.AddRange(autocompleteNames);
codeTextBox.AutoCompleteCustomSource.AddRange(autocompleteCodes);