在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);
}
}
}

你可能感兴趣的:(windows,exception,object,String,table,Forms)