Следует ли использовать привязку данных в проекте Windows Forms?

Я разрабатываю приложение с Winforms и пошел по пути привязки данных моих сеток с помощью BindingSource. Мой вопрос:

Это лучший подход, чтобы взять? Должен ли я вручную заполнять ячейки, а не позволять BindingSource сделать это для меня? Может ли это привести к проблемам в будущем? Если есть какие-либо ситуации, когда привязка данных создаст проблемы, это было бы полезно.

один из моих коллег клянется черным и синим не использовать привязка данных. Я не очень доверяю тому, что он говорит, поэтому любые плюсы/минусы будут ценными.

в ситуации многопользовательского приложения, подключающегося к одной базе данных и редактируемого DataGrids, как бы вы решили проблемы параллелизма для обновления данных?

5 ответов


ругаясь черным и синим о что-нибудь без объяснения причин, честно говоря, стремно.

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

для простого отображения данных, большой! Это сэкономит вам много времени и ошибок. Для прямого обновления данных (включая логику свойств и IDataErrorInfo поддержка), опять,большой!. И действительно, это основная часть WPF и т. д.

есть сценарии, где это не так полезно:

  • массивные тома данных (где "виртуальный" режим помогает или лучше: не отображать 10 миллионов строк; это никому не полезно)
  • если вы не хотите, чтобы обновления были прямыми, а скорее: отложено-хотя привязка к модели представления (а не к вашей модели домена) является хорошим аргументом против этого
  • когда вы есть много разных потоков, пытающихся привязаться к одним и тем же данным (опять же, независимые модели представления помогают здесь)

Я лично считаю, что использование процесса привязки данных, который намного проще для программирования, вам не нужно делать итерацию, и в целом уменьшает LOC.

с концепции привязки данных в .NET windows forms:

преимущества привязки данных

  1. привязка данных в .NET может использоваться для запись управляемых данными приложений быстро. Привязка данных .NET позволяет вам писать меньше кода с быстрой исполнение, но все равно получить работу сделано наилучшим образом.

  2. .NET автоматически записывает много кода привязки данных для вас в фоновом режиме (вы можете увидеть его в разделе "сгенерированный код Windows"), поэтому разработчику не нужно тратить время на написание кода для базовой привязки данных, но все равно имеет гибкость изменения любого кода, который он хотел бы. Мы получаем преимущества как связанного, так и несвязанного подхода.

  3. контроль над Процесс привязки данных с помощью событий. Более подробно об этом будет сказано ниже.

недостатки привязки данных

  1. более оптимизированный код можно написать с помощью несвязанных или традиционных методов.

  2. полная гибкость может быть достигнута только с помощью несвязанного подхода.

Fore больше разъяснений, которые вы должны увидеть концепции привязки данных в .NET windows forms


Я не вижу никаких проблем с компонентом BindingSource. Единственное предложение-не использовать нетипизированные наборы данных. Используйте BindingList с классами и всем вашим набором.

BindingSource определенно лучше, чем традиционная привязка данных.

вы можете прочитать все о Архитектура Компонентов BindingSource.

один очень простой пример:

с привязками данных его очень просто преобразовать данные из базы данных во что-то полезное. Например, у вас есть десятичный столбец в базе данных со средней суммой валюты:

с привязками данных вы можете легко отобразить его как валюту:

private void DecimalToCurrencyString(object sender, ConvertEventArgs cevent)
{
   // The method converts only to string type. Test this using the DesiredType.
   if(cevent.DesiredType != typeof(string)) return;

   // Use the ToString method to format the value as currency ("c").
   cevent.Value = ((decimal) cevent.Value).ToString("c");
}

private void CurrencyStringToDecimal(object sender, ConvertEventArgs cevent)
{
   // The method converts back to decimal type only. 
   if(cevent.DesiredType != typeof(decimal)) return;

   // Converts the string back to decimal using the static Parse method.
   cevent.Value = Decimal.Parse(cevent.Value.ToString(),
   NumberStyles.Currency, null);
}

private void BindControl()
{
   // Creates the binding first. The OrderAmount is a Decimal type.
   Binding b = new Binding
      ("Text", ds, "customers.custToOrders.OrderAmount");
   // Add the delegates to the event.
   b.Format += new ConvertEventHandler(DecimalToCurrencyString);
   b.Parse += new ConvertEventHandler(CurrencyStringToDecimal);
   text1.DataBindings.Add(b);
}

Ссылка На Источник http://msdn.microsoft.com/en-us/library/system.windows.forms.binding.format.aspx


Я использую привязку данных, потому что она работает, и это то, для чего она предназначена. Вы всегда можете использовать OnDataBinding для любых настроек (если необходимо) в сочетании с вызовом методов Bind или DataBind для любого элемента управления, который их поддерживает.


вы спросили своего коллегу, почему он не использует привязку данных? Если он против использования его для конкретного случая, тогда он может быть на что-то наткнулся, но если он против использования его вообще, тогда вы правы, не доверяя ему.

привязка данных очень полезна в некоторых случаях и избавляет вас от многих проблем и ошибок.

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

в целом, как и большинство инструментов программирования, это где и как планирую использовать его, что оправдывает его использование.