在BindingSource组件的事件中捕获异常的注意事项

(原创文章·转载请注明来源:http://blog.csdn.net/hulihui)

数据绑定组件BindingSource提供了非常完善的功能来协助控件和底层数据源之间的连接与管理,“是Visual Studio Studio 2005在Windows Forms数据绑定方面最重要的创举之一”(章立民,《Visual C# 2005文件IO与数据存取秘诀》)。该组件提供的主要与常用事件有如下几类:
  • 记录导航事件:PositionChanged与CurrentChanged,用于记录移动时定制自己的处理逻辑。
  • 记录增加事件:AddingNew,用于新加项添加到绑定源数据集时做一些赋值处理。
  • 列表或属性变更事件:ListChanged与CurrentItemChanged,绑定源或当前项的属性变更时触发该事件。
  • 错误捕获事件:DataError,处理绑定源发生的某些异常。
上述事件中发生异常将有如下三种处理方式:
  • DataError捕获记录导航事件CurrentChanged与PositionChanged中的异常。
  • CLR捕获并抛出记录增加事件AddingNew中的异常。
  • 事件本身隐式处理,DataError和CLR均无法捕获。ListChanged和CurrentItemChanged中的异常就是这种情形。
总之,在处理BindingSource的事件处理程序时,必须注意可能发生的异常,仅可能排除异常隐患。至于为何不能在DataError中捕获ListChanged与CurrentItemChanged异常,也许是笔者所知有限,也许在.NET 3.0或3.5等更高的版本中具有这些功能,有待以后笔者再作探讨。

下面是测试代码。如果去掉AddingNew事件注册行前的//,CLR将捕获并抛出该事件中的异常。
using System;
using System.Data;
using System.Windows.Forms;
using System.ComponentModel;

namespace ConsoleApplication16
{
class Program
{
static void Main(string[] args)
{
DataTable dataTable = new DataTable("Table1");
dataTable.Columns.Add("column1", typeof(string));
dataTable.Rows.Add(new string[] { "1"});
dataTable.Rows.Add(new string[] { "2" });

BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataTable;

bindingSource.DataError += new BindingManagerDataErrorEventHandler(DataError);
bindingSource.CurrentChanged += new EventHandler(CurrentChanged);
bindingSource.PositionChanged += new EventHandler(PositionChanged);
// bindingSource.AddingNew += new System.ComponentModel.AddingNewEventHandler(AddNewEvent);
bindingSource.CurrentItemChanged += new EventHandler(CurrentItemChanged);
bindingSource.ListChanged += new ListChangedEventHandler(ListChanged);

bindingSource.MoveLast(); // 触发两个行移动事件

DataRowView row = bindingSource.AddNew() as DataRowView; // 触发AddingNew事件
row.EndEdit(); // 触发ListChanged、CurrentItemChanged事件

Console.ReadKey();
}

static void CurrentChanged(object sender, EventArgs e)
{
Console.WriteLine("CurrentChanged Fired");
throw new Exception("CurrentChanged");
}

static void PositionChanged(object sender, EventArgs e)
{
Console.WriteLine("PositionChanged Fired");
throw new Exception("PositionChanged");
}

static void AddNewEvent(object sender, AddingNewEventArgs e)
{
Console.WriteLine("AddNewEvent Fired");
throw new Exception("AddNew"); // 可以被CLR捕获
}

static void CurrentItemChanged(object sender, EventArgs e)
{
Console.WriteLine("CurrentItemChanged Fired");
throw new Exception("CurrentItemChanged");
}

static void ListChanged(object sender, ListChangedEventArgs e)
{
Console.WriteLine("ListChanged Fired");
throw new Exception("ListChanged");
}

static void DataError(object sender, BindingManagerDataErrorEventArgs e)
{
Console.WriteLine("DataError: " + e.Exception.Message);
}
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值