zoukankan      html  css  js  c++  java
  • 如何在自定义数据源组件中为自定义属性提供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中查看一下效果

    image

    【注意】此时,Folder属性的右侧有一个小按钮。点击该按钮

    image

    我们可以选择一个目录,例如c:\windows

    image

    点击“确定”

    image

    很不错,不是吗?

    那么,除了这个Editor之外,是否还有其他现成的Editor呢

    image

    另外一个用得最多的编辑器是:FileNameEditor,顾名思义,这是选择文件的

    但是,除此之外,我们自己能不能提供一个自定义的编辑器呢?答案是可以的,我们可以继承UITypeEdit这个类型

    首先,添加System.Draming和System.Drawing.Design的引用

    image

    然后,编写一个类型

        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的引用,并且准备一个简单的窗体,大致如下

    image

    image

    窗体的代码如下

    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中的效果

    image 

    点击右侧的小图标

    image

    点击“选择一个文件夹”按钮

    image

    image

    大功告成,呵呵

    本文由作者:陈希章 于 2009/6/21 12:23:44 发布在:http://www.cnblogs.com/chenxizhang/
    本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
  • 相关阅读:
    判断浏览器是pc端和移动
    高德谷歌地图切换成英文地图
    小程序修改默认的单选框复选框样式
    推荐系统| ① Movies概述
    推荐系统| ② 离线推荐&基于隐语义模型的协同过滤推荐
    数据结构与算法| 复杂度分析
    Flink| 运行架构
    机器学习| 高数-基础
    Flink| 概述| 配置安装
    推荐系统| 概述
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1507680.html
Copyright © 2011-2022 走看看