这是项目中用到的一个技术,很多情况下,客户需要大量录入数据,这是为了提高效率,需要在客户端的用户界面上采用DataGrid来处理,但是.NET提供的DataGrid控件的功能有限,一般只能处理文本,当某一列的数据类型是时间和日期型的时候,客户的输入相当麻烦,也不能有效处理用户误输入的错误格式,如果能够将时间日期控件绑定到Grid的单元格中,既加快了用户的录入,也能有效防止用户的错误录入。
进一步,如果我们自定义了一个控件,类似文本框,但是针对特定的应用做过调整,我们也想把它绑定到Grid中,这种情况下也可以采用这里提到的技术。
要想在DataGrid中绑定一个控件,首先需要了解的是在DataGrid中,外观和内容的关系,DataGrid把数据和外观分得很清楚,可以这么认为,DataGrid就是一个空架子,背后有一个非可视化的东西在支持它,这就是DataTableStyle,可以将这个类看作一个集合,是由DataGridColumnStyle组成的,而DataGridColumnStyle本身有外观和数据2个方面的属性,我们绑定一个控件实际上是改变DataGridColumnStyle的外观部分的属性,数据部分的属性等不用管它,这样就能够把需要绑定的控件与DataGridColumnStyle关联起来,进一步就可以和DataTableStyle关联起来,也就可以改变DataGrid的外观了。
因此所有的工作集中在一点上就是完成一个DataGridColumnStyle的改造。所谓的改造也就是从DataGridColumnStyle继承一下。实际上,DataGridTextBoxColumn就是从DataGridColumnStyle继承的。
下面的一个类是将DateTimPicker绑定到DataGridColumnStyle上的一段代码,绑定其它的控件都可以按照这个方法完成。
public class DataGridTimePickerColumn : DataGridColumnStyle
{
//这里增加需要被DataGridColumnStyle承载的控件,这里用的是一个
//DateTimePicker,日期控件,其他的控件类似
private DateTimePicker myDateTimePicker = new DateTimePicker();
//isEditing属性用于跟踪用户是否在宿主控件中编辑了其中的数据。
private bool isEditing;
//构造函数
public DataGridTimePickerColumn() : base()
{
myDateTimePicker.Visible = false;
myDateTimePicker.Format=DateTimePickerFormat.Time;
myDateTi