自动完成 2 个字段中的字符串集合
本文关键字:字符串 集合 字段 | 更新日期: 2023-09-27 17:56:16
是否可以从拖曳字段中获取autoCompleteStringCollection的值?我有一个包含字段 Code 和 NameA 的表,是否可以从这两个字段获取自动完成建议?我在窗口窗体中使用 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;
}
我猜你的意思是这样的
string query = @"Select distinct [NameA] from [tblItem] union
Select distinct [Code] from [tblItem] ";
可以使用如下所示
的 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);