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






4.22/5 (5投票s)
本文讨论了如何创建一个 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/。