使用AutocompleteStringCollection时,C#无法将对象类型数组转换为字符串类型数组
本文关键字:数组 类型 对象 转换 字符串 AutocompleteStringCollection 使用 | 更新日期: 2023-09-27 18:20:28
我想使用texbox使用数据库自动完成。数据库查询使用联接语句从三个表中返回一个名称列表。现在我在使用.ToArray()时出现错误:
错误:"无法将源类型采购[]转换为目标类型字符串[]"
这是我的代码:
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
}
第二种方式稍微慢一点,但在我看来更漂亮。那就是用林克;
using System.Linq;
...
string[] productNameFromJoinedDatabase =
_aPurchaseManager.GetProductNameWithCategoryAndBrandName().Select(purchase => purchase.ProductName).ToArray();