如何在自定义数据源组件中为自定义属性提供UIEditor
我们上一篇讲到了开发一个简单的数据源组件。大家应该还记得,我们有一个自定义属性:Folder。这个属性代表的是我们要遍历的目录。
但有一点美中不足的是,Folder按理说最好是让用户去选择文件夹,而不应该手工输入才算比较好。因为手工输入有可能会输错,也比较麻烦。
那么,如何添加这样的支持呢?
我们可以修改一下下面的方法。红色的部分是我添加到
public override void ProvideComponentProperties() { ComponentMetaData.RuntimeConnectionCollection.RemoveAll(); RemoveAllInputsOutputsAndCustomProperties(); IDTSCustomProperty90 folder = ComponentMetaData.CustomPropertyCollection.New(); folder.Name = "Folder"; folder.UITypeEditor = "System.Windows.Forms.Design.FolderNameEditor, System.Design, Version=1.0.3300.0,"+ "Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; IDTSOutput90 output = ComponentMetaData.OutputCollection.New(); output.Name = "MyOutput"; //初始化的时候,准备几个输出列 IDTSOutputColumn90 fileNameColumn = output.OutputColumnCollection.New(); fileNameColumn.Name = "FileName"; fileNameColumn.SetDataTypeProperties(DataType.DT_WSTR, 256, 0, 0, 0); //如果是非Unicode则要提供CodePage,其他的类型可以设置为0 IDTSOutputColumn90 fileSizeColumn = output.OutputColumnCollection.New(); fileSizeColumn.Name = "FileSize"; fileSizeColumn.SetDataTypeProperties(DataType.DT_I8, 0, 0, 0, 0); IDTSOutputColumn90 fileExtensionColumn = output.OutputColumnCollection.New(); fileExtensionColumn.Name = "FileExtension"; fileExtensionColumn.SetDataTypeProperties(DataType.DT_WSTR, 50, 0, 0, 0); }
也就是说,我们为这个属性指定了一个所谓的Editor。
现在,我们可以在BI Studio中查看一下效果
【注意】此时,Folder属性的右侧有一个小按钮。点击该按钮
我们可以选择一个目录,例如c:\windows
点击“确定”
很不错,不是吗?
那么,除了这个Editor之外,是否还有其他现成的Editor呢
另外一个用得最多的编辑器是:FileNameEditor,顾名思义,这是选择文件的
但是,除此之外,我们自己能不能提供一个自定义的编辑器呢?答案是可以的,我们可以继承UITypeEdit这个类型
首先,添加System.Draming和System.Drawing.Design的引用
然后,编写一个类型
public class MyTypeUIEditor : System.Drawing.Design.UITypeEditor { /// <summary> /// 这个方法会被自动调用。 /// </summary> /// <param name="context"></param> /// <param name="provider"></param> /// <param name="value">这是组件现有值</param> /// <returns>要返回给组件的值</returns> public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) { return base.EditValue(context, provider, value); } }
我们需要编写一个继承自UITypeEditor的类型,然后重写EditValue方法即可。一般这里可以传递一个窗体过来
为此,我们添加System.Windows.Forms的引用,并且准备一个简单的窗体,大致如下
窗体的代码如下
using System; using System.Windows.Forms; namespace MyDataFlowComponentSample { public partial class MyUIEditorForm : Form { public MyUIEditorForm() { InitializeComponent(); } public MyUIEditorForm(string current) : this() { lbCurrentFolder.Text = current; } private string _path = string.Empty; public string Path { get { return _path; } set { _path = value; } } private void btSelect_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); if (dialog.ShowDialog() == DialogResult.OK) { Path = dialog.SelectedPath; return; } this.DialogResult = DialogResult.None; } } }
到这里为止,我们准备好了一个用于编辑的窗体,现在回到MyTypeUIEditor这个类型,修改它的EditValue方法
public class MyTypeUIEditor : System.Drawing.Design.UITypeEditor { /// <summary> /// 这个方法会被自动调用。 /// </summary> /// <param name="context"></param> /// <param name="provider"></param> /// <param name="value">这是组件现有值</param> /// <returns>要返回给组件的值</returns> public override object EditValue( System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) { string current = "目前没有选择目录"; if (value != null) current = value.ToString(); MyUIEditorForm form = new MyUIEditorForm(current); if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK) { return form.Path; } return current; } public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } }
我们实现了EditValue方法,并且指定了我们的编辑器是一个模态对话框。(本文的尾部还将介绍另外一种方式:下拉列表)
我们最后需要将这个Editor指定给数据源组件的Folder属性
IDTSCustomProperty90 folder = ComponentMetaData.CustomPropertyCollection.New(); folder.Name = "Folder"; folder.UITypeEditor = typeof(MyTypeUIEditor).AssemblyQualifiedName;
因为我们的编辑器类型就在程序集内部,所以可以像上面这样指定
我们来测试一下最后在BI Studio中的效果
点击右侧的小图标
点击“选择一个文件夹”按钮
大功告成,呵呵