【问题标题】:Should I use data binding in my Windows Forms project?我应该在我的 Windows 窗体项目中使用数据绑定吗?
【发布时间】:2011-07-09 17:47:59
【问题描述】:

我正在使用 Winforms 开发一个应用程序,并且已经使用BindingSource 走上了数据绑定我的网格的道路。我的问题是:

这是最好的方法吗?我应该手动填充单元格而不是让BindingSource 为我做吗?它会导致更进一步的问题吗?如果在任何情况下数据绑定会产生问题,那将很有用。

我的一位同事发誓不使用数据绑定。我不太相信他说的话,所以任何优点/缺点都会很有价值。

在多用户应用程序连接单个数据库且可编辑DataGrids 的情况下,您将如何解决数据更新的并发问题?

【问题讨论】:

  • 否:不使用数据绑定。 ;-)
  • 数据绑定 = 快速/更少控制。没有数据绑定=慢/更多控制。 (速度就是开发时间)
  • 我遇到的一个问题是 DBConcurrency 异常:一个用户加载数据,另一个用户加载相同的数据,第一个用户更新数据,第二个用户更新数据导致 DBConcurrency 异常。这里有什么好的解决方案?

标签: c# winforms data-binding


【解决方案1】:

坦率地说,对任何事情不屑一顾地骂人是愚蠢的。

在某些情况下,数据绑定非常有用,在某些情况下,麻烦多于其价值。如果你的同事只从“痛苦”的一端报告,那对你没有任何帮助。

对于数据的简单显示,太棒了!它将为您节省大量时间和错误。对于数据的直接更新(包括属性逻辑和IDataErrorInfo 支持),再次,太棒了!。实际上它是 WPF 等的核心部分。

在某些情况下它不是那么有用:

  • 海量数据(“虚拟”模式有帮助,或者更好:不要显示 1000 万行;这对任何人都没有帮助)
  • 如果您不希望更新是直接的,而是:延迟 - 尽管绑定到视图模型(而不是您的域模型)是一个很好的反驳理由
  • 当您有许多不同的线程试图绑定到相同的数据时(同样,独立视图模型在这里提供帮助)

我会问你的同事“为什么”;如果他们不能给出充分的理由,我会倾向于忽略他们。没有合理的讨论,这只是 FUD。

【讨论】:

    【解决方案2】:

    我个人觉得使用数据绑定的过程,编程起来容易很多,不用做迭代,整体降低了LOC。

    来自Data binding concepts in .NET windows forms:

    数据绑定的优点

    1. .NET 中的数据绑定可用于 编写数据驱动的应用程序 迅速地。 .NET 数据绑定允许 您可以快速编写更少的代码 执行,但仍然得到工作 以最好的方式完成。

    2. .NET 会在后台自动为你编写大量的数据绑定代码(你可以在“Windows 生成代码”部分看到),因此开发者不必花时间编写基本数据绑定的代码,但仍然可以灵活地修改他想要的任何代码。我们得到了绑定和非绑定方法的好处。

    3. 使用事件控制数据绑定过程。这将在本文后面更详细地讨论。

    数据绑定的缺点

    1. 可以使用未绑定或传统方法编写更优化的代码。

    2. 完全的灵活性只能通过使用未绑定的方法来实现。

    更多说明,您应该看到Data binding concepts in .NET windows forms

    【讨论】:

      【解决方案3】:

      我认为 BindingSource 组件没有问题。唯一的建议是不要使用无类型数据集。将 BindingList 与类和所有设置一起使用。

      BindingSource 绝对比传统的数据绑定好。

      您可以阅读有关BindingSource Component Architecture 的所有信息。

      一个非常简单的例子:

      使用数据绑定可以非常简单地将数据库中的数据转换为有用的东西。例如,您在数据库中有一个十进制列,表示货币金额:

      通过数据绑定,您可以轻松地将其显示为货币:

      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

      【讨论】:

        【解决方案4】:

        我使用数据绑定是因为它有效,这就是它的用途。您始终可以将 OnDataBinding 用于任何自定义(如果需要),同时为任何支持它们的控件调用 Bind 或 DataBind 方法。

        【讨论】:

          【解决方案5】:

          您是否问过您的同事他不使用数据绑定的原因是什么?如果他反对在特定情况下使用它,那么他可能正在做某事,但如果他完全反对使用它,那么你不信任他是对的。

          数据绑定在某些情况下非常有用,可以为您省去很多麻烦和容易出错的代码。

          例如假设您使用多个控件来显示您的数据:如果您使用数据绑定,您的控件将在您对数据源进行更改后自动更新,并且在大多数情况下您不需要编写任何代码来更新您的控件。而如果您不使用数据绑定,则必须手动更新每个控件,这将导致容易出错的代码和数据一致性问题,并且如果逻辑发生变化并且复杂性是您始终希望在您的代码。

          总而言之,与大多数编程工具一样,正是您计划在何处以及如何使用它来证明其使用是合理的。

          【讨论】:

          • 有一些原因,但很蹩脚,比如:“你会遇到并发问题”、“这是一个陷阱”和“你将无法做任何你需要做的事情”
          猜你喜欢
          • 2022-11-10
          • 1970-01-01
          • 2013-08-19
          • 1970-01-01
          • 1970-01-01
          • 2012-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多