2012-04-13 5 views
1

Можно ли связать Datagridview с StringCollection? я пытался сделать это таким образом,Связать Datagridview с StringCollection

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

Bud вместо предметов коллекции DataGridView показывает длину элементов.

+0

Возможный дубликат http://stackoverflow.com/questions/1104341/net-c-sharp-binding -iliststring-to-a-datagridview – Markissimo

+0

его не дубликат, его для .net2.0 – Habib

ответ

2

Проблема заключается в том, что при привязке к StringCollection базовый тип - string, поэтому он вытаскивает первое свойство, которое он находит, из типа string для отображения. Это свойство - Length.

Что вы можете сделать, это обернуть свой 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? –

+1

@Ask, 'DataMember' берет имя свойства. Если вы посмотрите на [Публичные свойства String] (http://msdn.microsoft.com/en-us/library/system.string_members (v = vs.80) .aspx), вы увидите, что у него есть только два свойства и ни один не получает текст текста. Итак, вы не можете установить DataMember, чтобы вы получили текст. Единственный способ обойти это - предоставить свой собственный класс, который предоставляет свое собственное свойство, раскрывающее строку. Вместо 'StringCollection' вы могли бы использовать' List <> 'или' BindingList <> 'или' ObservableCollection' и т. Д.? –

+0

Спасибо за комментарий. По умолчанию вы можете выбрать только StringCollection в редакторе свойств, вот почему я застрял на нем. –

Смежные вопросы