次の方法で共有


カスタム レポート アイテムのデザイン時コンポーネントの作成

カスタム レポート アイテムのデザイン時コンポーネントは、Visual Studio レポート デザイナー環境で使用できるコントロールです。カスタム レポート アイテムのデザイン時コンポーネントは、ドラッグ アンド ドロップ操作を使用できるアクティブ化されたデザイン画面、Visual Studio プロパティ ブラウザーとの統合、およびカスタム プロパティ エディター機能を提供します。

カスタム レポート アイテムのデザイン時コンポーネントを使用すると、ユーザーは、デザイン環境のレポート上にカスタム レポート アイテムを配置し、カスタム レポート アイテムのカスタム データ プロパティを設定してから、カスタム レポート アイテムをレポート プロジェクトの一部として保存できます。

開発環境でデザイン時コンポーネントを使用して設定されるプロパティは、ホスト デザイン環境によってシリアル化およびシリアル化解除され、レポート定義言語 (RDL) ファイルに要素として格納されます。レポート プロセッサによるレポートの実行時には、デザイン時コンポーネントを使用して設定されたプロパティが、レポート プロセッサによってカスタム レポート アイテムの実行時コンポーネントに渡されます。実行時コンポーネントは、カスタム レポート アイテムを表示してレポート プロセッサに返します。

注意

カスタム レポート アイテムのデザイン時コンポーネントは、Microsoft .NET Framework コンポーネントとして実装されます。ここでは、カスタム レポート アイテムのデザイン時コンポーネントに固有の実装詳細について説明します。.NET Framework を使用したコンポーネント開発の詳細については、MSDN ライブラリの「Visual Studio のコンポーネント」を参照してください。

完全に実装されたカスタム レポート アイテムの例については、「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 クラスを使用して渡されます。コンポーネントの CustomData クラスから新しいインスタンスを作成して既定値に設定する際には、CustomReportItemDesigner クラスの実装で InitializeNewComponent メソッドをオーバーライドしてください。

次のコードは、コンポーネントの CustomData クラスを初期化する際に、カスタム レポート アイテムのデザイン時コンポーネント クラスで CustomReportItemDesigner.InitializeNewComponent メソッドをオーバーライドする例です。

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 プロパティをデザイン環境で変更するには、複数の方法があります。デザイン時コンポーネントによって公開され、BrowsableAttribute 属性でマークされたあらゆるプロパティは、Visual Studio プロパティ ブラウザーを使用して変更できます。また、プロパティを変更するには、カスタム レポート アイテムのデザイン画面にアイテムをドラッグする方法や、デザイン環境でコントロールを右クリックし、ショートカット メニューの [プロパティ] をクリックしてカスタム プロパティ ウィンドウを表示する方法もあります。

以下のコード例では、Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData プロパティに BrowsableAttribute 属性が適用されています。

[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」を参照してください。

Visual Studio での Windows フォームを使ったプログラミングの詳細については、MSDN ライブラリの次のトピックを参照してください。

  • コンポーネントのデザイン時属性

  • Visual Studio のコンポーネント

  • チュートリアル: Visual Studio のデザイン時機能を活用した Windows フォーム コントロールの作成