创建自定义报表项设计时组件

自定义报表项设计时组件是一种可在 Visual Studio 报表设计器环境中使用的控件。 自定义报表项设计时组件可提供能接受拖放操作的激活的设计图面,可与 Visual Studio 属性浏览器集成,且可提供自定义属性编辑器。

通过自定义报表项设计时组件,用户可以在设计环境下在报表中放置自定义报表项,可以针对自定义报表项设置自定义数据属性,然后可以将自定义报表项另存为报表项目的一部分。

通过使用开发环境中的设计时组件设置的属性由主机设计环境序列化和反序列化。 然后,这些属性作为元素存储在报表定义语言 (RDL) 文件中。 当报表处理器执行报表时,通过使用设计时组件设置的属性由报表处理器传递给自定义报表项运行时组件,该组件呈现自定义报表项并将其传回报表处理器。

注意

自定义报表项设计时组件以 Microsoft .NET Framework 组件的形式实现。 本文档将介绍自定义报表项设计时组件所特有的实现细节。

有关完全实现的自定义报表项的示例,请参阅 SQL Server Reporting Services Product Samples(SQL Server Reporting Services 产品示例)。

实现设计时组件

自定义报表项设计时组件的主类继承自 Microsoft.ReportDesigner.CustomReportItemDesigner 类。 除了用于 .NET Framework 控件的标准属性外,该组件类还应定义 CustomReportItem 属性。 此属性必须与如在 reportserver.config 文件中定义的相应自定义报表项的名称对应。 有关 .NET Framework 属性的列表,请参阅 .NET Framework SDK 文档中的属性。

以下代码示例显示的是将应用到自定义报表项设计时控件的属性:

namespace PolygonsCRI  
{  
    [LocalizedName("Polygons")]  
    [Editor(typeof(CustomEditor), typeof(ComponentEditor))]  
        [ToolboxBitmap(typeof(PolygonsDesigner),"Polygons.ico")]  
        [CustomReportItem("Polygons")]  
  
    public class PolygonsDesigner : CustomReportItemDesigner  
    {  
...  

初始化组件

可以使用 CustomData 类传递自定义报表项的用户指定属性。 实现 CustomReportItemDesigner 类时应重写 InitializeNewComponent 方法以创建相应组件的 CustomData 类的新实例,并将其设置为默认值

下面的代码示例显示的是自定义报表项设计时组件类重写 CustomReportItemDesigner.InitializeNewComponent 方法以初始化该组件的 CustomData 类的示例

public override void InitializeNewComponent()  
        {  
            CustomData = new CustomData();  
            CustomData.DataRowHierarchy = new DataHierarchy();  
  
            // Shape grouping  
            CustomData.DataRowHierarchy.DataMembers.Add(new DataMember());  
            CustomData.DataRowHierarchy.DataMembers[0].Group = new Group();  
            CustomData.DataRowHierarchy.DataMembers[0].Group.Name = Name + "_Shape";  
            CustomData.DataRowHierarchy.DataMembers[0].Group.GroupExpressions.Add(new ReportExpression());  
  
            // Point grouping  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers.Add(new DataMember());  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers[0].Group = new Group();  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers[0].Group.Name = Name + "_Point";  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers[0].Group.GroupExpressions.Add(new ReportExpression());  
  
            // Static column  
            CustomData.DataColumnHierarchy = new DataHierarchy();  
            CustomData.DataColumnHierarchy.DataMembers.Add(new DataMember());  
  
            // Points  
            IList<IList<DataValue>> dataValues = new List<IList<DataValue>>();  
            CustomData.DataRows.Add(dataValues);  
            CustomData.DataRows[0].Add(new List<DataValue>());  
            CustomData.DataRows[0][0].Add(NewDataValue("X", ""));  
            CustomData.DataRows[0][0].Add(NewDataValue("Y", ""));  
        }  

修改组件属性

可以通过多种方式在设计环境下修改 CustomData 属性。 可以使用 Visual Studio 属性浏览器修改任何由设计时组件公开且以 BrowsableAttribute 特性标记的属性。 另外,还可通过以下方式修改属性:将相应项拖动到自定义报表项的设计图面,或者在设计环境下右键单击该控件,然后在快捷菜单上选择“属性”以显示自定义属性窗口

以下代码示例显示应用了 BrowsableAttribute 特性的 Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData 属性

[Browsable(true), Category("Data")]  
public string DataSetName  
{  
      get  
      {  
         return CustomData.DataSetName;  
      }  
      set  
      {  
         CustomData.DataSetName = value;  
      }  
   }  
  

可以为您的设计时组件提供自定义属性编辑器对话框。 自定义属性编辑器实现应继承自 ComponentEditor 类,并应创建可用于属性编辑的对话框实例。

下面的示例显示了继承自 ComponentEditor 的类的实现,并显示了自定义属性编辑对话框:

internal sealed class CustomEditor : ComponentEditor  
{  
   public override bool EditComponent(  
      ITypeDescriptorContext context, object component)  
    {  
     PolygonsDesigner designer = (PolygonsDesigner)component;  
     PolygonProperties dialog = new PolygonProperties();  
     dialog.m_designerComponent = designer;  
     DialogResult result = dialog.ShowDialog();  
     if (result == DialogResult.OK)  
     {  
        designer.Invalidate();  
        designer.ChangeService().OnComponentChanged(designer, null, null, null);  
        return true;  
     }  
     else  
        return false;  
    }  
}  

自定义属性编辑器对话框可以调用报表设计器表达式编辑器。 在下面的示例中,在用户选择相应组合框中的第一个元素时,会调用表达式编辑器:

private void EditableCombo_SelectedIndexChanged(object sender,   
    EventArgs e)  
{  
   ComboBox combo = (ComboBox)sender;  
   if (combo.SelectedIndex == 0 && m_launchEditor)  
   {  
      m_launchEditor = false;  
      ExpressionEditor editor = new ExpressionEditor();  
      string newValue;  
      newValue = (string)editor.EditValue(null, m_designerComponent.Site, m_oldComboValue);  
      combo.Items[0] = newValue;  
   }  
}  
  

使用设计器谓词

设计器谓词是与事件处理程序链接的菜单命令。 在设计环境中使用自定义报表项运行时控件时,可以添加组件快捷菜单中显示的设计器谓词。 可以使用 Verbs 属性从运行时组件返回可用设计器谓词的列表

下面的代码示例演示了设计器谓词和要添加到的 DesignerVerbCollection事件处理程序。 该示例还显示了事件处理程序代码:

public override DesignerVerbCollection Verbs  
{  
    get  
    {  
        if (m_verbs == null)  
        {  
            m_verbs = new DesignerVerbCollection();  
            m_verbs.Add(new DesignerVerb("Proportional Scaling", new EventHandler(OnProportionalScaling)));  
         m_verbs[0].Checked = (GetCustomProperty("poly:Proportional") == bool.TrueString);  
        }  
  
        return m_verbs;  
    }  
}  
  
private void OnProportionalScaling(object sender, EventArgs e)  
{  
   bool proportional = !  
        (GetCustomProperty("poly:Proportional") == bool.TrueString);  
   m_verbs[0].Checked = proportional;  
   SetCustomProperty("poly:Proportional", proportional.ToString());  
   ChangeService().OnComponentChanged(this, null, null, null);  
   Invalidate();  
}  

使用装饰

此外,自定义报表项类还可实现 Microsoft.ReportDesigner.Design.Adornment 类。 使用修饰后,自定义报表项控件可提供设计图面主矩形之外的区域。 这些区域可用来处理用户界面事件,如鼠标单击和拖放操作。 在 Reporting Services Microsoft.ReportDesigner 命名空间中定义的 Adornment 类是在 Windows 窗体中找到的 Adorner 类的传递实现。 有关 Adorner 类的完整文档,请参阅 MSDN 库中的行为服务概述。 有关实现 Microsoft.ReportDesigner.Design.Adornment 类的示例代码,请参阅 SQL Server Reporting Services Product Samples(SQL Server Reporting Services 产品示例)。

有关在 Visual Studio 中编程和使用Windows 窗体的详细信息,请参阅 MSDN 库中的以下文章:

  • Design-Time Attributes for Components(组件的设计时属性)

  • Visual Studio 中的组件

  • Walkthrough: Creating a Windows Forms Control that Takes Advantage of Visual Studio Design-Time Features(演练:创建一个利用 Visual Studio 设计时功能的 Windows 窗体控件)

自定义报表项体系结构
创建自定义报表项运行时组件
自定义报表项类库
如何:部署自定义报表项