2009-01-30 313 views
2

我有一個應用程序,我需要使用公司名稱填充文本框,並使用數據庫中的所有可用公司名稱填充了自定義的AutoCompleteStringColection。當用戶通過在列表中輸入和選擇公司名稱來更改公司名稱時,我需要擁有所選公司的id(Guid)的新公司名稱,以便我可以查找並獲取公司其餘信息。因爲公司名稱不能保證是唯一的,所以我不能對名稱進行查詢,並希望獲得正確的記錄。我研究了擴展字符串類,但是我能找到的都是添加方法的示例。我試圖通過添加一個變量來存儲id和方法來獲取和設置id,但是當檢索id時它總是最後一個id集。可以通過擴展將屬性添加到類中嗎?我已經改變了我正在嘗試做的查找公司名稱並顯示用戶將從中選擇的列表,如果多個匹配被返回,但我仍然想知道我是否可以以這種方式添加屬性以防萬一它再次出現。使用屬性擴展字符串類?

回答

7

不,您不能使用屬性擴展類。此外,Stringsealed,所以您不能通過繼承來擴展它。唯一的辦法是組成:在你自己的班級中封裝string

2

這聽起來像你應該創建自己的類:

class Company { 
    public string Name {get;set;} 
    public override string ToString() {return Name;} 
    // etc 
} 

現在綁定到一組Company對象; ToString覆蓋將確保默認顯示Name,並且您可以添加任何您需要的內容。對於更復雜的場景,您可以使用(例如)DisplayMemberValueMember(組合框的)指向不同的屬性(而不是默認的ToString)。

1

您應該使用ComboBox而不是TextBox。創建一個包含公司名稱和ID的自定義類型,確保它覆蓋ToString以返回公司名稱。將這些自定義類型添加到ComboBox而不是直接字符串,並使用ListItems的AutoCompleteSource。

0

我用康拉德的答案和爲了完整起見,我在這裏發佈我的解決方案。我需要向我的用戶顯示自動完成的公司名稱列表,但由於他們可能有多個同名的公司,所以我需要Guid ID在數據庫中找到他們的選擇。所以我寫了自己的類繼承自AutoCompleteStringCollection。

public class AutoCompleteStringWithIdCollection : AutoCompleteStringCollection 
{ 
    private List<Guid> _idList = new List<Guid>(); 


    /*-- Properties --*/ 

    public Guid this[int index] 
    { 
     get 
     { 
      return _idList[index]; 
     } 
    } 

    public Guid this[string value] 
    { 
     get 
     { 
      int index = base.IndexOf(value); 
      return _idList[index]; 
     } 
    } 

    /*-- Methods --*/ 

    public int Add(string value, Guid id) 
    { 
     int index = base.Add(value); 
     _idList.Insert(index, id); 
     return index; 
    } 

    public new void Remove(string value) 
    { 
     int index = base.IndexOf(value); 
     if (index > -1) 
     { 
      base.RemoveAt(index); 
      _idList.RemoveAt(index); 
     } 
    } 

    public new void RemoveAt(int index) 
    { 
     base.RemoveAt(index); 
     _idList.RemoveAt(index); 
    } 

    public new void Clear() 
    { 
     base.Clear(); 
     _idList.Clear(); 
    } 

}