2

我第一次在 C# 中组合了一个自定义控制流 SSIS 任务。在我的任务 UI 编辑器上,我有一个属性网格,在其中一个选项中,我希望能够填充任何可用任务变量的下拉列表,并为用户提供创建新变量的选项。我已经研究了几天,我在论坛上找到了一些很好的例子,但我现在有点迷失了。我的代码如下编译,编辑器显示一个下拉列表,但它是空白的。逐步完成后,它似乎归结为这一行:

taskHostProperty = context.Instance.GetType().GetProperty("TransferTask", typeof(TaskHost));The "TransferTask" being the name of my control flow task.  I'm wondering if this is correct?  

我的完整代码如下。

//Property Grid Property
  [Category("General"),
            Description("Specifies the local Path for this task"),
            Browsable(true),
            ReadOnly(false),
            DesignOnly(false),
            TypeConverter(typeof(VariableConverter)),
            DisplayName("Local Path")]            
            public string LocalPath
            {
                get
                {
                    return this.stLocalPath;
                }
                set
                {                    
                    dtsVariableService = serviceProvider.GetService(typeof(IDtsVariableService)) as IDtsVariableService;
                    dtsVariableService.PromptAndCreateVariable(parentWindow, dtsContainer,"Local Path","User",typeof(string));
                    this.stLocalPath = value;
                }
            } 
//Variable Converter
internal class VariableConverter : TypeConverter
        {
            StandardValuesCollection svc = new StandardValuesCollection(new ArrayList());
            public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }
            public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                TaskHost taskHost = null;
                PropertyInfo taskHostProperty = null;
                List<string> values = new List<string>();
                values.Add(NEW_VARIABLE);
                if (context == null)
                {
                    return svc; 
                }
                if (context.Instance == null)
                {
                    return svc;
                }
                taskHostProperty = context.Instance.GetType().GetProperty("TransferTask", typeof(TaskHost));
                if (taskHostProperty == null)
                {
                    return svc;
                }
                taskHost = taskHostProperty.GetValue(context.Instance, null) as TaskHost;

                foreach(Variable v in taskHost.Variables)
                {
                    if (!v.SystemVariable && v.DataType == TypeCode.String)
                    {
                        values.Add(v.QualifiedName);
                    }
                }
                values.Sort();
                return new StandardValuesCollection(values);
    }
4

1 回答 1

1

最后,我放弃了尝试将变量添加到属性网格,而是创建了自己的表单。在允许用户添加新的 SSIS 变量之后,我使用以下代码填充组合框。我刷新了数据源。我仍然想知道如何正确地做到这一点,但我只是没有时间坐下来解决它。我使用以下内容首先获取了我需要的 SSIS 变量,我能够添加一个新的 SSIS 变量,并且我能够选择新创建的变量。我确信有更好的方法可以做到这一点,但现在可行。

public ObservableCollection<string> FillVariableList()
        {
            ObservableCollection<string> variables = new ObservableCollection<string>();

            variables.Add(string.Empty);
            variables.Add(New_Variable);        

            foreach (Variable v in thetaskHost.Variables)
            {
                if (!v.SystemVariable && v.DataType == TypeCode.String && !variables.Contains(v.Name))
                {
                    variables.Add(v.Name);                  
                }
            }

            return variables;
        }

我使用以下内容允许用户添加新的 SSIS 变量或选择现有的 SSIS 变量并刷新 SSIS 变量组合框。

private void cmbxVariables_SelectionChangeCommitted(object sender, EventArgs e)
    {
        if (cmbxVariables.Text == New_Variable)
        {
            try
            {
                DtsContainer dtsContainer = null;
                dtsVariableServie = serviceProvider.GetService(typeof(IDtsVariableService)) as IDtsVariableService;
                Variable var = dtsVariableServie.PromptAndCreateVariable(null, dtsContainer, "VariableName", "User", typeof(string));
                if (!var.IsNull())
                {
                    cmbxVariables.DataSource = null;
                    cmbxVariables.DataSource = FillVariableList();
                }
            }
            catch (Exception exe)
            {
                MessageBox.Show(exe.ToString());
            }
        }
        else
        {
            foreach (Variable v in thetaskHost.Variables)
            {
                if (v.Name == cmbxVariables.Text)
                {
                    //Do something with the variable selected
                    break;
                }
            }
        }          
    }
于 2012-08-30T10:31:04.917 回答