自动完成 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;
        }

自动完成 2 个字段中的字符串集合

我猜你的意思是这样的

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();

更新:您完全更改了问题,使我之前的答案无效。

我将任务分为两个不同的任务:

  1. 将表读入对象列表。
  2. 从对象列表中获取自动完成源。

如果您有一个表示数据的类,则处理数据比直接处理数据库更容易。创建表示数据的类

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);