2012-04-13 81 views
1

是否可以將Datagridview綁定到StringCollection? 我試圖做到這一點的方式,而不是收集的datagridview的項目將Datagridview綁定到StringCollection

StringCollection dict = Settings.Default.MyDict; 
    BindingSource bs = new BindingSource(); 
    bs.DataSource = dict; 
    this.DGV.DataSource = bs; 

芽顯示了項目的長。

+0

的 可能的複製http://stackoverflow.com/questions/1104341/net-c-sharp-binding -iliststring-to-a-datagridview – Markissimo 2012-04-13 12:23:27

+0

它不是重複的,它的.net2.0 – Habib 2012-04-13 12:39:16

回答

2

問題是,當它綁定到StringCollection時,基礎類型爲string,因此它將從找到的類型string中抽出第一個屬性來顯示。該屬性是長度。

你可以做的是將你的StringCollection包裝在你自己製作的類中,並公開一個屬性來顯示string的文本。爲string

包裝類:

public class MyString 
{ 
    private string _myString; 

    public string Text 
    { 
     get { return _myString; } 
     set { _myString = value; } 
    } 

    public MyString(string str) 
    { 
     _myString = str; 
    } 
} 

您的代碼就變成了:

StringCollection dict = Settings.Default.MyDict; 
// put your string in the wrapper 
List<MyString> anotherdict = new List<MyString>(); 
foreach (string str in dict) 
{ 
    anotherdict.Add(new MyString(str)); 
} 
BindingSource bs = new BindingSource(); 
// bind to the new wrapper class 
bs.DataSource = anotherdict; 
this.DGV.DataSource = bs; 
+0

是否有可能通過更改DataMember屬性而無需包裝? – 2012-04-16 08:05:15

+1

@Ask,'DataMember'採用屬性的名稱。如果你看[String's Public Properties](http://msdn.microsoft.com/en-us/library/system.string_members(v = vs80).aspx),你會發現它只有兩個屬性,沒有人能得到你的字符串文本。所以,沒有什麼可以設置'DataMember'來獲得文本。唯一的方法是提供你自己的類,它提供自己的屬性暴露字符串。你可以使用'List <>',或'BindingList <>',或'ObservableCollection'等來代替'StringCollection'。 – 2012-04-16 14:04:22

+0

感謝您的評論。默認情況下,你只能在屬性編輯器中選擇StringCollection,這就是爲什麼我堅持它。 – 2012-04-16 17:56:53