Привязка DataGridView к реализации класса в .NET - PullRequest
1 голос
/ 11 сентября 2010

Как мне связать мою коллекцию объектов T, которая реализует интерфейс и добавляет дополнительные свойства в DataGrid? Вот пример:

// interface
public interface IPerson{
[DisplayName(@"FullName")]
string Name{ get; }
}

// implementation
public class Employee : IPerson{
[DisplayName(@"Net Salary")]
public int Salary { 
    get { return 1000; }
}

public string Name{
    get { return "Foo"; }
}

// collection
SortableBindingList<IPerson> MyList { get; set }
...
...
MyList.Add(new Employee());
...
dataGridView.DataSource = MyList;

Когда я делаю это, оно связывает только Имя, но не Зарплату.

Есть ли способ связать оба свойства (в данном случае имя и зарплата)? Спасибо.

Ответы [ 3 ]

1 голос
/ 11 сентября 2010

Это потому, что Salary не входит в определение IPerson вашего интерфейса.

Вы должны либо добавить Salary в свой IPerson интерфейс и реализовать его в своем классе Employee, либо изменить определение свойства MyList, как показано ниже;

SortableBindingList<Employee> MyList { get; set } 

Редактировать после комментариев

Вы можете достичь своей цели, внедрив ITypedList. Это не тривиальная задача. Поэтому я бы не советовал вам делать это, если вам не нужно.

Вы можете наследовать от SortableBindingList<IPerson> и внедрять ITypedList. Вам также нужно создать пользовательский PropertyDescriptor, чтобы он заработал.

Вот хорошая статья на эту тему Виртуальные свойства , которую я только что нашел. (Эта статья является первым результатом поиска вместе ключевых слов ITypedList и PropertyDescriptor).

Надеюсь, эта помощь.

0 голосов
/ 11 декабря 2015

Вы можете заставить DataGridView смотреть на реальные объекты вместо интерфейса, приведя к объекту. В моем примере я использую VB.NET, но вам, вероятно, не сложно перевести на C #.

dataGridView.DataSource = New SortableBindingList(Of Object)(MyList.Cast(Of Object).ToList())

В моем случае MyList - это IList(Of IPerson).

0 голосов
/ 11 сентября 2010

Name в вашем интерфейсе, но Salary нет. Добавьте Salary в ваш интерфейс, и он должен работать нормально.

Если вы не хотите менять интерфейс, используйте SortableBindingList<Employee> MyList вместо SortableBindingList<IPerson> MyList

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...