PowerTools ActiveReports for .NET 9.0J > ActiveReportsユーザーガイド > サンプルとチュートリアル > チュートリアル > ページレポート/RDLレポートのチュートリアル > カスタマイズ > カスタムデータプロバイダ |
ページレポート/RDLレポートでは、カスタムデータプロバイダを使用し、実行時と設計時に正規以外のデータソースを使用することができます。このチュートリアルでは、カスタムデータプロバイダを使用したプロジェクトのソリューションを作成し、CSVファイルからデータを取得する方法を紹介します。
このトピックでは、以下のタスクを行います。
このチュートリアルを完了すると、CSVファイルから取得したデータを読み込んだレポートがデザイナ上に表示されます。
カスタムデータプロバイダのためのデザイナプロジェクトを作成する
テキスト(RichTextBoxのTextプロパティに貼り付けます) |
コードのコピー
|
---|---|
1.レポートエクスプローラでは、データソースノードを右クリックし、[データソースの追加]を選択します。 2.[レポートデータソース]ダイアログでは、全般のページに2つの種類ボックスをドロップダウンし、CSV Data Providerを選択してOKをクリックします。 3.レポートエクスプローラで、DataSource1を右クリックし、[データセットの追加]を選択します。 4.表示されるダイアログでは、クエリのページを選択します。 5.クエリボックスをドロップダウンし、カスタムクエリエディタを表示します。 6.CSVファイルの選択ボタンをクリックし、このプロジェクトにCategories.csvファイルを開きます。 7.OKをクリックして設定を保存し、ダイアログを閉じます。 8.プレビューをクリックし、CSVから取得したデータのレポートを表示します。 |
Visual Basic
Visual Basicコード(クラスの上貼り付けます) |
コードのコピー
|
---|---|
Imports System.Xml Imports System.IO Imports GrapeCity.ActiveReports.Design |
C#
C#コード(クラスの上貼り付けます) |
コードのコピー
|
---|---|
using System.Xml; using System.IO; using GrapeCity.ActiveReports.Design; |
Visual Basic
Visual Basicコード(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
Using reportStream = File.OpenRead("DemoReport.rdlx") Using reader = XmlReader.Create(reportStream) Designer1.LoadReport(reader, DesignerReportType.Page) End Using End Using |
C#
C#コード(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
using (var reportStream = File.OpenRead("DemoReport.rdlx")) { using (var reader = XmlReader.Create(reportStream)) { designer1.LoadReport(reader, DesignerReportType.Page); } } |
カスタムデータプロバイダを使用するためのプロジェクトを作成する
Configファイルに貼り付けます |
コードのコピー
|
---|---|
<?xml version="1.0" encoding="utf-8" ?> <Configuration> <Extensions> <Data> <Extension Name="CSV" DisplayName="CSV Data Provider" Type="CustomDataProvider.CsvDataProvider.CsvDataProviderFactory, CustomDataProvider" CommandTextEditorType="CustomDataProvider.CSVDataProvider.QueryEditor, CustomDataProvider"/> </Data> </Extensions> </Configuration> |
テキストファイルに貼り付けます |
コードのコピー
|
---|---|
EmployeeID(int32),LastName,FirstName,Role,City 1,James,Yolanda,Owner,Columbus 7,Reed,Marvin,Manager,Newton 9,Figg,Murray,Cashier,Columbus 12,Snead,Lance,Store Keeper,Columbus 15,Halm,Jeffry,Store Keeper,Columbus 17,Hames,Alma,Store Keeper,Oak Bay 18,Nicki,Aubrey,Store Keeper,Columbus 24,Cliett,Vikki,Store Keeper,Newton |
データを表示するためのレポートを追加する
メモ: ページレポートを使用する場合には、1つのページにすべてのデータを表示するためにFixedSizeプロパティを設定する必要があります。 |
テキストボックス名 | 値 | 背景色 |
---|---|---|
TextBox1 | 名前 | MediumSlateBlue |
TextBox2 | 地位 | MediumSlateBlue |
TextBox3 | 都市 | MediumSlateBlue |
TextBox4 | =Fields!FirstName.Value & " " & Fields!LastName.Value | |
TextBox5 | =Fields!Role.Value | |
TextBox6 | =Fields!City.Value |
カスタムデータプロバイダを格納するためのクラスライブラリプロジェクトを追加する
Visual Basic
Visual Basic コード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
Namespace CSVDataProvider 'データソース内のフィールドに関する情報を表します。 Friend Structure CsvColumn Private ReadOnly _fieldName As String Private ReadOnly _dataType As Type ' CsvColumnクラスの新しいインスタンスを生成します。 ' fieldNameはCsvColumnのインスタンスによって表されるフィールドの名前です。 ' dataTypeはCsvColumnのインスタンスによって表されるフィールドの種類です。 Public Sub New(fieldName As String, dataType As Type) If fieldName Is Nothing Then Throw New ArgumentNullException("fieldName") End If If dataType Is Nothing Then Throw New ArgumentNullException("dataType") End If _fieldName = fieldName _dataType = dataType End Sub ' CsvColumnのインスタンスによって表されるフィールドの名前を取得します。 Public ReadOnly Property FieldName() As String Get Return _fieldName End Get End Property ' CsvColumnのインスタンスによって表されるフィールドの種類を取得します。 Public ReadOnly Property DataType() As Type Get Return _dataType End Get End Property ' CsvColumnのインスタンスを表わす文字列を返します。 Public Overrides Function ToString() As String Return [String].Concat(New String() {FieldName, "(", DataType.ToString(), ")"}) End Function ' 2つのCsvColumnのインスタンスが同じかどうかを判定します。 ' 指定されたCsvColumnが現在のCsvColumnと同じである場合はTrueを返し、そうではない場合はFalseを返します。 Public Overrides Function Equals(obj As Object) As Boolean Dim flag As Boolean If TypeOf obj Is CsvColumn Then flag = Equals(CType(obj, CsvColumn)) Else flag = False End If Return flag End Function Private Overloads Function Equals(column As CsvColumn) As Boolean Return column.FieldName = FieldName End Function ' ハッシュテーブルのようなハッシュアルゴリズムやデータ構造での使用に適した、CsvColumnのハッシュ関数として機能します。 ' 現在のCsvColumnインスタンスにハッシュコードを返します。 Public Overrides Function GetHashCode() As Integer Return (FieldName.GetHashCode() + DataType.GetHashCode()) End Function End Structure End Namespace |
C#
C#コード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
using System; namespace CustomDataProvider.CSVDataProvider { // データソース内のフィールドに関する情報を表します。 internal struct CsvColumn { private readonly string _fieldName; private readonly Type _dataType; // CsvColumnクラスの新しいインスタンスを生成します。 // fieldNameはCsvColumnのインスタンスによって表されるフィールドの名前です。 // dataTypeはCsvColumnのインスタンスによって表されるフィールドの種類です。 public CsvColumn(string fieldName, Type dataType) { if (fieldName == null) throw new ArgumentNullException("fieldName"); if (dataType == null) throw new ArgumentNullException("dataType"); _fieldName = fieldName; _dataType = dataType; } // CsvColumnのインスタンスによって表されるフィールドの名前を取得します。 public string FieldName { get { return _fieldName; } } //CsvColumnのインスタンスによって表されるフィールドの種類を取得します。 public Type DataType { get { return _dataType; } } //CsvColumnのインスタンスを表わす文字列を返します。 public override string ToString() { return String.Concat(new string[] {FieldName, "(", DataType.ToString(), ")"}); } //2つのCsvColumnのインスタンスが同じかどうかを判定します。 //指定されたCsvColumnが現在のCsvColumnと同じである場合はTrueを返し、そうではない場合はFalseを返します。 public override bool Equals(object obj) { bool flag; if (obj is CsvColumn) { flag = Equals((CsvColumn) obj); } else { flag = false; } return flag; } private bool Equals(CsvColumn column) { return column.FieldName == FieldName; } //ハッシュテーブルのようなハッシュアルゴリズムやデータ構造での使用に適した、CsvColumnのハッシュ関数として機能します。 //現在のCsvColumnインスタンスにハッシュコードを返します。 public override int GetHashCode() { return (FieldName.GetHashCode() + DataType.GetHashCode()); } } } |
Visual Basic
Visual Basicコード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
Imports System Imports System.Collections Imports System.Globalization Imports System.IO Imports System.Text.RegularExpressions Imports GrapeCity.ActiveReports.Extensibility.Data Namespace CSVDataProvider ' .NET Framework CSV Data ProviderのIDataReaderの実施を提供します。 Friend Class CsvDataReader Implements IDataReader ' メモ:HashcodeProviderとComparerは大文字と小文字を区別します。 Private _typeLookup As New Hashtable(StringComparer.Create(CultureInfo.InvariantCulture, False)) Private _columnLookup As New Hashtable() Private _columns As Object() Private _textReader As TextReader Private _currentRow As Object() ' 正規表現は、高速化するためにコンパイル済みです。 |
C#
C#コード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
using System; using System.Collections; using System.Globalization; using System.IO; using System.Text.RegularExpressions; using GrapeCity.ActiveReports.Extensibility.Data; namespace CustomDataProvider.CSVDataProvider { // .NET Framework CSV Data ProviderのIDataReaderの実施を提供します。 internal class CsvDataReader :IDataReader { //メモ:HashcodeProviderとComparerは大文字と小文字を区別します。 private Hashtable _typeLookup = new Hashtable(StringComparer.Create(CultureInfo.InvariantCulture, false)); private Hashtable _columnLookup = new Hashtable(); private object[] _columns; private TextReader _textReader; private object[] _currentRow; //正規表現は、高速化するためにコンパイル済みです。 |
Visual Basic
Visual Basicコード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
Imports System Imports System.IO Imports GrapeCity.ActiveReports.Extensibility.Data Namespace CSVDataProvider ' .NET Framework CSV Data ProviderのIDbDataReaderの実施を提供します。 Public NotInheritable Class CsvCommand Implements IDbCommand Private _commandText As String Private _connection As IDbConnection Private _commandTimeout As Integer Private _commandType As CommandType ' CsvCommandクラスの新しいインスタンスを生成します。 Public Sub New() Me.New(String.Empty) End Sub ' コマンドテキストのあるCsvCommandクラスの新しいインスタンスを生成します。 ' commandTextパラメータはコマンドテキストを表します。 Public Sub New(commandText As String) Me.New(commandText, Nothing) End Sub ' コマンドテキストとCsvConnectionがあるCsvCommandクラスの新しいインスタンスを生成します。 ' commandTextパラメータは、コマンドテキストを表します。 ' connectionパラメータは、データソースとCsvConnectionを表します。 Public Sub New(commandText As String, connection As CsvConnection) _commandText = commandText _connection = connection End Sub ' データソースで実行するコマンドを取得、設定します。 Public Property CommandText() As String Implements IDbCommand.CommandText Get Return _commandText End Get Set(value As String) _commandText = value End Set End Property ' コマンド実行の試行を終了し、エラーを生成するまでの待機時間を取得、設定します。 Public Property CommandTimeout() As Integer Implements IDbCommand.CommandTimeout Get Return _commandTimeout End Get Set(value As Integer) _commandTimeout = value End Set End Property ' CommandTextプロパティの解放を指示する値を取得、設定します。 Public Property CommandType() As CommandType Implements IDbCommand.CommandType Get Return _commandType End Get Set(value As CommandType) _commandType = value End Set End Property ' CsvCommandのインスタンスに使用するCsvConnectionの値を取得、設定します。 Public Property Connection() As IDbConnection Get Return _connection End Get Set(value As IDbConnection) _connection = value End Set End Property ' CommandTextをCsvConnectionに送信し、いずれかのCommandBehavior値を使用し、CsvDataReaderをビルドします。 ' behaviorパラメータはCommandBehaviorの値を表します。 ' CsvDataReaderオブジェクトを返却。 Public Function ExecuteReader(behavior As CommandBehavior) As IDataReader Implements IDbCommand.ExecuteReader Return New CsvDataReader(New StreamReader(_commandText)) End Function ' 定数に拡張パラメータを指定したコマンドテキストを表わす文字列を返却します。 Public Function GenerateRewrittenCommandText() As String Implements IDbCommand.GenerateRewrittenCommandText Return _commandText End Function ' CommandTextをCsvConnectionに送信し、CsvDataReaderをビルドします。 ' CsvDataReaderオブジェクトを返します。 Public Function ExecuteReader() As IDataReader Implements IDbCommand.ExecuteReader Return ExecuteReader(CommandBehavior.SchemaOnly) End Function #Region "Non implemented IDbCommand Members" Public ReadOnly Property Parameters() As IDataParameterCollection Implements IDbCommand.Parameters Get Throw New NotImplementedException() End Get End Property Public Property Transaction() As IDbTransaction Implements IDbCommand.Transaction Get Throw New NotImplementedException() End Get Set(value As IDbTransaction) Throw New NotImplementedException() End Set End Property Public Sub Cancel() Implements IDbCommand.Cancel End Sub Public Function CreateParameter() As IDataParameter Implements IDbCommand.CreateParameter Throw New NotImplementedException() End Function #End Region #Region "IDisposable Members" ' CsvCommandに使用するリソースを放出します。 Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Private Sub Dispose(disposing As Boolean) If disposing Then If _connection IsNot Nothing Then _connection.Dispose() _connection = Nothing End If End If End Sub #End Region End Class End Namespace |
C#
C# コード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
using System; using System.IO; using GrapeCity.ActiveReports.Extensibility.Data; namespace CustomDataProvider.CSVDataProvider { // .NET Framework CSV Data ProviderのIDbCommandの実施を提供します。 public sealed class CsvCommand :IDbCommand { private string _commandText; private IDbConnection _connection; private int _commandTimeout; private CommandType _commandType; /// Creates a new instance of the CsvCommand class. public CsvCommand() : this(string.Empty) { } // コマンドテキストのあるCsvCommandクラスの新しいインスタンスを生成します。 // commandTextパラメータはコマンドテキストを表します。 public CsvCommand(string commandText) : this(commandText, null) { } // コマンドテキストとCsvConnectionがあるCsvCommandクラスの新しいインスタンスを生成します。 // commandTextパラメータ、コマンドテキストを表します。 // connectionパラメータは、データソースとCsvConnectionを表します。 public CsvCommand(string commandText, CsvConnection connection) { _commandText = commandText; _connection = connection; } // データソースで実行するコマンドを取得、設定します。 public string CommandText { get { return _commandText; } set { _commandText = value; } } // コマンド実行の試行を終了し、エラーを生成するまでの待機時間を取得、設定します。 public int CommandTimeout { get { return _commandTimeout; } set { _commandTimeout = value; } } // CommandTextプロパティの解放を指示する値を取得、設定します。 public CommandType CommandType { get { return _commandType; } set { _commandType = value; } } // CsvCommandのインスタンスに使用するCsvConnectionの値を取得、設定します。 public IDbConnection Connection { get { return _connection; } set { _connection = value; } } // CommandTextをCsvConnectionに送信し、いずれかのCommandBehavior値を使用し、CsvDataReaderをビルドします。 // behaviorパラメータはCommandBehaviorの値を表します。 // CsvDataReaderオブジェクトを返却。 public IDataReader ExecuteReader(CommandBehavior behavior) { return new CsvDataReader(new StreamReader(_commandText)); } // 定数に拡張パラメータを指定したコマンドテキストを表わす文字列を返却します。 public string GenerateRewrittenCommandText() { return _commandText; } // CommandTextをCsvConnectionに送信し、CsvDataReaderをビルドします。 // CsvDataReaderオブジェクトを返します。 public IDataReader ExecuteReader() { return ExecuteReader(CommandBehavior.SchemaOnly); } #region Non implemented IDbCommand Members public IDataParameterCollection Parameters { get { throw new NotImplementedException(); } } public IDbTransaction Transaction { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public void Cancel() { } public IDataParameter CreateParameter() { throw new NotImplementedException(); } #endregion #region IDisposable Members // CsvCommandに使用するリソースを放出します。 public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposing) { if (_connection != null) { _connection.Dispose(); _connection = null; } } } #endregion } } |
Visual Basic
Visual Basicコード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
Imports System Imports System.Collections.Specialized Imports GrapeCity.ActiveReports.Extensibility.Data Namespace CSVDataProvider ' .NET Framework CSV Data ProviderのIDbConnectionの実施を提供します。 Public NotInheritable Class CsvConnection Implements IDbConnection Private _localizedName As String ' CsvConnectionクラスの新しいインスタンスを生成します。 Public Sub New() _localizedName = "Csv" End Sub ' CsvConnectionクラスの新しいインスタンスを生成します。 ' localizedNameはCsvConnectionのインスタンスのローカライズ名を表します。 Public Sub New(localizeName As String) _localizedName = localizeName End Sub #Region "IDbConnection Members" ' データソースに接続の開始に使用する文字列を取得、設定します。 ' 備考:Csv Data Providerでは使いません。 Public Property ConnectionString() As String Implements IDbConnection.ConnectionString Get Return String.Empty End Get Set(value As String) End Set End Property ' 接続を確立する際の待機時間を取得、設定します。 ' 備考:Csv Data Providerでは使いません。 Public ReadOnly Property ConnectionTimeout() As Integer Implements IDbConnection.ConnectionTimeout Get Throw New NotImplementedException() End Get End Property ' データソースとのトランザクションを開始します。 ' 新しいトランザクションを表わすオブジェクトを返します。 ' 備考:Csv Data Providerでは使いません。 Public Function BeginTransaction() As IDbTransaction Implements IDbConnection.BeginTransaction Return Nothing End Function ' データソースとの接続を開きます。 ' 備考:Csv Data Providerでは使いません。 Public Sub Open() Implements IDbConnection.Open End Sub ' データソースとの接続を閉じます。これは、接続を閉じるために推奨される方法です。 Public Sub Close() Implements IDbConnection.Close Dispose() End Sub ' CsvConnectionに関連付けたCsvCommandオブジェクトを生成し、返却します。 Public Function CreateCommand() As IDbCommand Implements IDbConnection.CreateCommand Return New CsvCommand(String.Empty) End Function Public Property DataProviderService() As IDataProviderService Implements IDbConnection.DataProviderService Get Return Nothing End Get Set(value As IDataProviderService) End Set End Property #End Region #Region "IDisposable Members" ' CsvConnectionに使用するリソースを解放します。 Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Private Sub Dispose(disposing As Boolean) End Sub ' オブジェクトがガベージコレクションによってクリアされる前に、そのオブジェクトがリソースを解放し、 ' その他のクリーンアップ操作を実行できるようにします。 Protected Overrides Sub Finalize() Try Dispose(False) Finally MyBase.Finalize() End Try End Sub #End Region #Region "IExtension Members" ' CsvConnectionのローカライズ名を取得します。 Public ReadOnly Property LocalizedName() As String Implements IDbConnection.LocalizedName Get Return _localizedName End Get End Property ' この拡張子の構成情報を指定します。 ' configurationSettingsは設定のNameValueCollectionを表します。 Public Sub SetConfiguration(configurationSettings As NameValueCollection) Implements IDbConnection.SetConfiguration End Sub #End Region End Class End Namespace |
C#
C# コード(デフォルトスタブと置換するには貼り付けます) |
コードのコピー
|
---|---|
using System; using System.Collections.Specialized; using GrapeCity.ActiveReports.Extensibility.Data; namespace CustomDataProvider.CSVDataProvider { // .NET Framework CSV Data ProviderのIDbConnectionの実施を提供します。 public sealed class CsvConnection :IDbConnection { private string _localizedName; // CsvConnectionクラスの新しいインスタンスを生成します。 public CsvConnection() { _localizedName = "Csv"; } // CsvConnectionクラスの新しいインスタンスを生成します。 // ocalizedNameはCsvConnectionのインスタンスのローカライズ名を表します。 public CsvConnection(string localizeName) { _localizedName = localizeName; } #region IDbConnection Members // データソースに接続の開始に使用する文字列を取得、設定します。 // 備考:Csv Data Providerでは使いません。 public string ConnectionString { get { return string.Empty; } set { ; } } // 接続を確立する際の待機時間を取得、設定します。 // 備考:Csv Data Providerでは使いません。 public int ConnectionTimeout { get { throw new NotImplementedException(); } } // データソースとのトランザクションを開始します。 // 新しいトランザクションを表わすオブジェクトを返します。 // 備考:Csv Data Providerには使いません。 public IDbTransaction BeginTransaction() { return null; } // データソースとの接続を開きます。 // 備考:Csv Data Providerには使いません。 public void Open() { ; } // データソースとの接続を閉じます。これは、接続を閉じるために推奨される方法です。 public void Close() { Dispose(); } // CsvConnectionに関連付けたCsvCommandオブジェクトを生成し、返却します。 public IDbCommand CreateCommand() { return new CsvCommand(string.Empty); } public IDataProviderService DataProviderService { get { return null; } set { } } #endregion #region IDisposable Members // CsvConnectionに使用するリソースを解放します。 public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { } // オブジェクトがガベージコレクションによってクリアされる前に、そのオブジェクトがリソースを解放し、 // その他のクリーンアップ操作を実行できるようにします。 ~CsvConnection() { Dispose(false); } #endregion #region IExtension Members // CsvConnectionのローカライズ名を取得します。 public string LocalizedName { get { return _localizedName; } } // この拡張子の構成情報を指定します。 // configurationSettingsは設定のNameValueCollectionを表します。 public void SetConfiguration(NameValueCollection configurationSettings) { } #endregion } } |
Visual Basic
Visual Basicコード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
Imports GrapeCity.ActiveReports.Extensibility.Data Imports GrapeCity.BI.Data.DataProviders Namespace CSVDataProvider ' .NET Framework CSV Data ProviderのDataProviderFactoryを実施します。 Public Class CsvDataProviderFactory Inherits DataProviderFactory ' CsvDataProviderFactoryクラスの新しいインスタンスを生成します。 Public Sub New() End Sub ' CsvCommandの新しいインスタンスを返します。 Public Overrides Function CreateCommand() As IDbCommand Return New CsvCommand() End Function ' CsvConnectionの新しいインスタンスを返します。 Public Overrides Function CreateConnection() As IDbConnection Return New CsvConnection() End Function End Class End Namespace |
C#
C#コード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
using GrapeCity.ActiveReports.Extensibility.Data; using GrapeCity.BI.Data.DataProviders; namespace CustomDataProvider.CSVDataProvider { // .NET Framework CSV Data ProviderのDataProviderFactoryを実施します。 public class CsvDataProviderFactory :DataProviderFactory { // CsvDataProviderFactoryクラスの新しいインスタンスを生成します。 public CsvDataProviderFactory() { } // CsvCommandの新しいインスタンスを返します。 public override IDbCommand CreateCommand() { return new CsvCommand(); } // CsvConnectionの新しいインスタンスを返します。 public override IDbConnection CreateConnection() { return new CsvConnection(); } } } |
クエリエディタにボタンを追加する
Visual Basic
Visual Basicコード(クラスのデフォルトスタブと置き換えます) |
コードのコピー
|
---|---|
Imports System Imports System.Collections.Generic Imports System.Drawing.Design Imports System.IO Imports System.Linq Imports System.Text Imports System.Text.RegularExpressions Imports System.Windows.Forms Imports System.Windows.Forms.Design Namespace CSVDataProvider Public NotInheritable Class QueryEditor Inherits UITypeEditor Dim path = "" Friend WithEvents btn As New Button() Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As UITypeEditorEditStyle Return UITypeEditorEditStyle.DropDown End Function Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As System.IServiceProvider, value As Object) As Object Dim edSvc As IWindowsFormsEditorService = DirectCast(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService) btn.Text = "Select CSV File..." Dim pdg = btn.Padding pdg.Bottom += 2 btn.Padding = pdg edSvc.DropDownControl(btn) If String.IsNullOrEmpty(path) Then Return String.Empty End If If Not File.Exists(path) Then Return String.Empty End If Return path End Function Private Sub btn_Click(sender As System.Object, e As System.EventArgs) Handles btn.Click Using openDlg = New OpenFileDialog() openDlg.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*" If openDlg.ShowDialog() <> DialogResult.OK Then path = "" Else path = openDlg.FileName End If End Using End Sub End Class End Namespace |
C#
C#コード(デフォルトスタブと置換するには貼り付けます) |
コードのコピー
|
---|---|
using System; using System.Collections.Generic; using System.Drawing.Design; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using System.Windows.Forms.Design; namespace CustomDataProvider.CSVDataProvider { public sealed class QueryEditor :UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; } public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value) { IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); var path = ""; var btn = new Button(); btn.Text = "Select CSV File..."; var pdg = btn.Padding; pdg.Bottom += 2; btn.Padding = pdg; btn.Click += delegate { using (var openDlg = new OpenFileDialog()) { openDlg.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*"; if (openDlg.ShowDialog() != DialogResult.OK) path = ""; else path = openDlg.FileName; } }; edSvc.DropDownControl(btn); if (string.IsNullOrEmpty(path)) return string.Empty; if (!File.Exists(path)) return string.Empty; return path; } } } |