65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 数据绑定将可编辑的 InkPicture 控件绑定到数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.22/5 (5投票s)

2004年8月20日

CPOL

4分钟阅读

viewsIcon

46075

downloadIcon

183

本文讨论了如何创建一个 UserControl,该 UserControl 绑定到数据库以显示 Tablet PC Ink。

引言

Visual Studio 提供了强大的数据绑定功能,使您可以,开发者,将控件连接到数据库表中的字段,并在表中当前记录更改时自动更新这些字段。它的强大之处在于,您只需很少的代码甚至无需代码即可完成此操作。对于字符串或数字等常见数据类型,数据绑定非常简单,但当要绑定到自定义类型的数据时,它会变得稍微复杂一些。本文解决了这个特殊情况,并讨论了如何将控件绑定到存储在数据库中的墨迹。请注意,我提到的墨迹是来自 Microsoft Tablet PC SDK 的墨迹。

本文是 使用 .NET 数据绑定显示数据库中的墨迹 文章的配套文章,该文章讨论了如何将只读的 InkPicture 控件绑定到数据库。如果您还没有阅读过那篇文章,现在最好花点时间阅读一下。本文将进一步讨论如何使用从 InkPicture 控件派生的控件创建墨迹到数据库的可读写绑定,并假设您熟悉上一篇文章中的所有内容。由于线程问题,无法直接创建 InkPicture 控件的可读/写绑定,因此我们需要创建自己的派生控件。

背景

本文假设您了解或有使用 Microsoft Visual Studio 中绑定控件的经验,并且能够使用 IDE 来操作连接、数据适配器和数据集。对用户控件开发的基本理解也有帮助,但并非必需。

使用代码

要使用本文中的代码,您需要在开发计算机上安装 Microsoft Tablet PC SDK。Tablet PC SDK 可以从 http://www.microsoft.com/downloads/details.aspx?FamilyID=b46d4b83-a821-40bc-aa85-c9ee3d6e9699&displaylang=en 下载。使用 SDK 不需要拥有 Tablet PC。

创建墨迹控件

由于 Tablet PC SDK 附带的 InkPicture 控件存在线程问题,因此有必要创建我们自己的 InkPicture 控件以用于数据绑定。我们不想重复造轮子,所以我们使用继承,并从 InkPicture 控件派生出我们的新控件。下面的代码显示了我们新控件的声明应该是什么样子。

  public class InkDataPicture : Microsoft.Ink.InkPicture
  {
  } 

继承的控件会继承其继承的控件的所有属性和方法,因此我们只需要实现我们想要更改的属性或方法。如果您进行过墨迹序列化和 InkPicture 框的开发,您会知道,如果要在代码中操作墨迹,控件的 InkEnabled 属性需要设置为 false。我们使用格式化事件绑定到控件的 Ink 属性,而这些事件不提供对源控件的访问;它们只提供对数据的访问。由于我们无法访问控件,因此无法确保 InkEnabled 属性为 false。因此,尝试绑定到可编辑的 InkPicture 框将会失败。

为了解决 InkPicture 控件的可编辑限制,我们将在继承的控件上实现一个新的 Ink 属性。在我们的属性中,每当写入 Ink 属性时,我们都会强制将 InkEnabled 属性设置为 false。下面的代码显示了这个新属性。

  public new Ink Ink
  {
    get {return base.Ink;}
    set
    {
      bool EnabledCache = base.InkEnabled;
      base.InkEnabled = false;
      base.Ink = value;
      base.InkEnabled = EnabledCache;
    }
  }

将墨迹绑定到控件

在上一篇文章中,我们描述了将只读墨迹绑定到控件的过程。对于可读写绑定,过程非常相似。唯一的区别是添加了一个 Parse 事件的事件处理程序。当数据库中的数据(字节数组)需要转换为墨迹时,会触发 Format 事件。Parse 事件正好相反,当墨迹需要转换回字节以存储在数据库中时会触发。下面的代码演示了如何将控件绑定到数据库并实现事件处理程序。

  private void Form1_Load(object sender, System.EventArgs e)
  {
    Binding binding = inkDataPicture1.DataBindings.Add(
          "Ink",myDS1,"MyTable.InkField");
    binding.Format += new ConvertEventHandler(binding_Format);
    binding.Parse += new ConvertEventHandler(binding_Parse);
    odbDA.Fill(myDS1);
  }
  
  private void binding_Format(object sender, ConvertEventArgs e)
  {
    Ink ink = new Ink();
    if (e.DesiredType.Equals(typeof(Ink)))
    {
      if (e.Value.GetType().Equals(typeof(byte[])))
      {
        byte[] bytes = (byte[])e.Value;
        if (bytes.Length>0)
        {
          ink.Load(bytes);
        }
      }
      e.Value = ink;
    }
  }

  private void binding_Parse(object sender, ConvertEventArgs e)
  {
    if (e.DesiredType.Equals(typeof(byte[])) && 
            e.Value.GetType().Equals(typeof(Ink)))
    {
      Ink ink = (Ink)e.Value;
      e.Value = ink.Save(PersistenceFormat.InkSerializedFormat);
    }
  }

上面的代码允许您对新控件中的墨迹进行更改,但这些更改在您指示之前不会保存到数据库。在我们的示例应用程序中,这是通过使用 DataAdapter 上的 Update 方法完成的。

  odbDA.Update(myDS1);

一切就这么简单。它不像标准的数据绑定那么简单,但一旦您成功了,您就可以忘记它,永远不再接触代码。

有关其他易于使用且免费的墨迹功能控件,请访问我们的网站:http://www.chickenscratchsoftware.com/

© . All rights reserved.