2009-08-26 2 views
1

Я пытаюсь понять разницу между следующими двумя примерами.DataTables и источник привязки

Во-первых, это то, как я в настоящее время назначаю Data для элемента управления в своем приложении WinForm.

lkuCounty.Properties.DataSource = Person.CountyList(); 
lkuCounty.Properties.PopulateColumns(); 
lkuCounty.Properties.DisplayMember = "CountyName"; 
lkuCounty.Properties.ValueMember = "CountyID"; 
lkuCounty.Properties.Columns[0].Visible = false; 
lkuCounty.Properties.Columns[2].Visible = false; 
lkuCounty.Properties.Columns[3].Visible = false; 

Это похоже на работу, хотя я признаю, что, если это немного не я, вероятно, не хватает опыта, чтобы сказать, просто взглянув на код. Также обратите внимание: Person.CountyList() фактически возвращает DataTable: \

Теперь как all of the examples Кажется, я говорю, что я должен это сделать.

memberBindingSource.DataSource = Person.CountyList(); 
lkuCounty.Properties.DataSource = memberBindingSource; 
lkuCounty.Properties.PopulateColumns(); 
lkuCounty.Properties.DisplayMember = "CountyName"; 
lkuCounty.Properties.ValueMember = "CountyID"; 
lkuCounty.Properties.Columns[0].Visible = false; 
lkuCounty.Properties.Columns[2].Visible = false; 
lkuCounty.Properties.Columns[3].Visible = false; 

Есть ли преимущество в использовании BindingSource? Есть ли негатив, чтобы сделать это ДРУГОЙ ПУТЬ?

Для контекста, это CRUD приложение WinForm в C# с использованием SQL 2005.

ответ

2

Для стандартных наборов данных/DataTables, то BindingSource просто обеспечивает еще один уровень косвенности между элементами управления и фактическим источником данных.

Однако большинство элементов управления, основанных на использовании данных, могут быть привязаны только к определенным источникам данных (которые реализуют IList, IListSource, IBindingList или IBindingListView). Это создает проблему, если вам нужно использовать пользовательский объект в качестве источника данных, потому что указанному объекту необходимо реализовать хотя бы один из этих интерфейсов.

Таким образом, вы можете реализовать весь интерфейс IList в своем бизнес-объекте - или вы можете наследовать свой объект из класса List и привязать его к BindingSource, который затем привязывается к вашим Control (s).

Длинные и короткие: если вы не уверены, что ваши источники данных всегда будут DataTables и т. П., Используйте BindingSource. Это добавляет незначительные накладные расходы, но это может сделать вашу жизнь намного проще.

Есть также очень хорошие функции управления состоянием, встроенные в BindingSource, что очень удобно, если ваше приложение является работоспособным. Вместо того, чтобы писать пользовательский код обработки состояния, просто позвольте BindingSource обрабатывать вещи для вас!

+0

, что необходимо предпринять, чтобы реализовать интерфейс IList на бизнес-объекта? Кроме того, с точки зрения состояния, вы хотите знать, были ли данные изменены? –

1

Вы можете привязывать непосредственно к любому объекту, как в первом примере. Однако этому объекту необходимо будет внедрить многие интерфейсы привязки данных, чтобы он интеллектуально реагировал на события, запускаемые элементом управления.

Например, привяжите список лиц к DataGridView. Теперь щелкните заголовок столбца, чтобы отсортировать столбец. Это не работает, потому что List не реализует необходимый интерфейс. Попробуйте сделать то же самое с DataTable. Сортировка столбцов волшебным образом работает. Это потому, что DataTable реализует все необходимые интерфейсы для привязки данных.

public class Person 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 

    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     //does not sort... 
     dataGridView1.DataSource = new List<Person> 
     { 
      new Person{ Age=11, Name="Jimmy" }, 
      new Person{ Age=12, Name="Suzie" } 
     }; 
    } 

Вы можете написать свои собственные классы, реализующие интерфейсы привязки данных. Это много работы. Вот большая книга по теме:

Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET

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