DataTables и источник привязки - PullRequest
1 голос
/ 26 августа 2009

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

Во-первых, именно так я сейчас назначаю данные для элемента управления в моем приложении 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: \

Теперь, как все примеры , похоже, говорят, что я должен это сделать.

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? Есть ли минус в том, чтобы делать это ДРУГИМ ПУТЬ?

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

Ответы [ 2 ]

2 голосов
/ 26 августа 2009

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

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

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

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

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

1 голос
/ 27 августа 2009

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

Например, связать список лиц с 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" }
        };
    }

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

Привязка данных в Windows Forms 2.0: программирование приложений данных Smart Client с помощью .NET

...