来自2个字段的AutoCompleteStringCollection

时间:2016-07-10 15:34:05

标签: c# winforms

是否可以从两个字段中获取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;
        }

2 个答案:

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

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

我会将任务分成两个不同的任务:

  1. 将表格读入对象列表。
  2. 从对象列表中获取自动完成源。
  3. 如果您有一个表示数据的类,而不是直接处理数据库,则可以更轻松地处理数据。创建一个表示数据的类

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