[英]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.