繁体   English   中英

C#在使用AutocompleteStringCollection时无法将对象类型数组转换为字符串类型数组

[英]C# cannot convert object type array to string type array while using AutocompleteStringCollection

我想使用使用数据库的texbox自动完成功能。 数据库查询使用来自三个表的join语句返回名称列表。 现在我在使用.ToArray()时遇到了erorr:

错误:“无法将源类型Purchase []转换为目标类型字符串[]”

这是我的代码:

PurchaseManager _aPurchaseManager = new PurchaseManager();

string[] productNameFromJoinedDatabase = _aPurchaseManager.GetProductNameWithCategoryAndBrandName();

productNameTextBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
productNameTextBox.AutoCompleteSource = AutoCompleteSource.CustomSource;


var autoComplete = new AutoCompleteStringCollection();
autoComplete.AddRange(productNameFromJoinedDatabase);
productNameTextBox.AutoCompleteCustomSource = autoComplete;

更新:

使用后:

       string[] productNameFromJoinedDatabase = _aPurchaseManager.GetProductNameWithCategoryAndBrandName().Select(x => x.ProductName).ToArray();

先前的错误已消失。 但这不适用于自动完成功能!

这是我的购买课程:

class Purchase
{
    public Int64 PurchaseId { get; set; }
    public string ProductName { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }
    public double TotalPurchasePrice { get; set; }
    public DateTime DateTime { get; set; }

    public CategoryEntry CategoryEntry { get; set; }
    public BrandEntry BrandEntry { get; set; }
    public Product Product { get; set; }
    public Purchase()
    {
        CategoryEntry = new CategoryEntry();
        BrandEntry = new BrandEntry();
        Product = new Product();
    }
}

这是我的数据库类:

public List<Purchase> GetProductNameWithCategoryAndBrandName()
    {

        List<Purchase> _aPurchaseList = new List<Purchase>();

        _connection.Open();
        string query = string.Format("SELECT CategoryEntryTable.Name, BrandEntryTable.Name, ProductNameExtentionEntryTable.ProductNameExtention " +
                                     "FROM ProductNameExtentionEntryTable " +
                                     "JOIN CategoryEntryTable " +
                                     "ON ProductNameExtentionEntryTable.CategoryId = CategoryEntryTable.CategoryId " +
                                     "JOIN BrandEntryTable " +
                                     "ON ProductNameExtentionEntryTable.BrandId = BrandEntryTable.BrandId");
        _command = new SqlCommand(query, _connection);
        SqlDataReader aReader = _command.ExecuteReader();

        if (aReader.HasRows)
        {
            while (aReader.Read())
            {
                _aPurchase = new Purchase();
                _aPurchase.CategoryEntry.Name = (aReader[0]).ToString();
                _aPurchase.BrandEntry.Name = (string)aReader[1];
                _aPurchase.Product.ProductNameExtention = (string)aReader[2];

                _aPurchaseList.Add(_aPurchase);
            }
        }
        _connection.Close();
        return _aPurchaseList;
    }

尝试_aPurchaseManager.GetProductNameWithCategoryAndBrandName().Select(x => x.ProductName).ToArray(); 或正确的产品名称属性是什么。

这里的问题(我认为)是GetProductNameWithCategoryAndBrandName返回的是Purchase数组而不是名称,因此,额外的Select是仅获取名称。

如果您认为它应该返回名称,请尝试修复该方法以仅返回名称。

更新:要获得一个组合名称,可以使用以下内容:

_aPurchaseManager.GetProductNameWithCategoryAndBrandName().Select(x => string.Format("{0} {1} {2}", x.CategoryEntry.Name, x.BrandEntry.Name, x.Product.ProductNameExtention)).ToArray();

并不是说string.Format将它们(由空格分隔,但是您可以使用任何字符分隔)连接成一个字符串。

看起来GetProductNameWithCategoryAndBrandName()返回一个Purchase对象数组,它告诉您不能简单地将其填充到字符串数组中。

string[] productNameFromJoinedDatabase
    = _aPurchaseManager.GetProductNameWithCategoryAndBrandName();

您必须自己进行转换,最有可能选择自动完成所需的属性。

假设“ Name”属性是“ Purchase”类中的一个字符串,也许是这样的(未经测试的),这就是您希望自动完成的基础:

var purchases = _aPurchaseManager.GetProductNameWithCategoryAndBrandName();

autoComplete.AddRange(purchases.Select(p => p.Name).ToArray());

由于我看不到错误可能在其他地方发生,因此我假设它在您的第二行中。

string[] productNameFromJoinedDatabase = _aPurchaseManager.GetProductNameWithCategoryAndBrandName();

我还将假定PurchaseManager.GetProductNameWithCategoryAndBrandName()返回类型Purchase[]而不是字符串。

有两种方法可以解决此问题,它们在功能上是相同的,但在性能方面有所不同。 快速方法:

Purchase[] purchases = _aPurchaseManager.GetProductNameWithCategoryAndBrandName();
string[] productNameFromJoinedDatabase = new string[purchases.Length];

for (int i = 0; i < purchases.Length; i++)
{
    productNameFromJoinedDatabase[i] = purchases[i].ProductName; // where ProductName is the name you're trying to get
}

第二种方法是速度较慢,但​​在我看来更漂亮。 那就是使用Linq;

using System.Linq;

...

string[] productNameFromJoinedDatabase =
    _aPurchaseManager.GetProductNameWithCategoryAndBrandName().Select(purchase => purchase.ProductName).ToArray();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM