はじめに
データベースのテーブルからデータを取得する際は主にクエリを使用しますが、クエリはあくまでも設定した条件に一致したデータを一括で抽出するのに使用します。条件さえ設定できれば自動的にデータを取り出せるので大変便利ですが、必要なデータを任意に1つずつ取得して新しいテーブルを作成する、という作業には向いていません。
「PowerTools ComponentOne Studio 2012J」のC1TrueDBGridコントロールは、複数のグリッド間でドラッグ&ドロップ操作を使用してデータをやり取りする機能を持っています。
例えば、片方のグリッドでデータベースデータをすべて表示し、そこから必要なデータをドラッグ&ドロップでもう片方のグリッドにコピーするという操作が可能です。
そこで、今回はこのドラッグ&ドロップ機能を使い、SQL Serverのデータベースから1つずつデータを取り出して新しい表を作成するアプリケーションを作成してみました。
対象読者
Visual Basic 2005/2008/2010、またはVisual C# 2005/2008/2010を使ってプログラムを作ったことがある人。
必要な環境
Visual Basic 2005/2008/2010、Visual C# 2005/2008/2010、Visual Studio 2005/2008/2010のいずれかでプログラムが作れる環境。
なお、本プログラムはWindows 7上で動作するVisual Studio 2010を使用して作成し、動作確認を行っています。
プログラム実行時の注意事項
本プログラムは、「PowerTools ComponentOne Studio 2012J」を使用して作成しています。そのため、アプリケーションを配布する場合は、「PowerTools ComponentOne Studio 2012J」のアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。
本記事のサンプルアプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。
ファイル名 | 説明 |
C1.Win.C1TrueDBGrid.4.dll | 本体アセンブリ(※) |
C1.C1Report.4.dll | 本体アセンブリ(※) |
C1.Win.C1Report.4.dll | 本体アセンブリ(※) |
このファイルを、プログラムを実行するフォルダに格納します。
.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0以上のバージョンの.NET Frameworkがインストールされていることが必須条件です。
コントロールのインストール
「PowerTools ComponentOne Studio 2012J」を使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境に、「PowerTools ComponentOne Studio 2012J」をインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできます。
ダウンロードしたい製品にチェックを付け[申込フォーム]ボタンを押すと、「トライアル版申込フォーム」ページに移動しますので、「個人情報の収集および使用に同意する 」にチェックを入れ「同意する」ボタンをクリックします。
トライアル申込フォームが表示されますので、必要情報を登録すると添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきます。ここからダウンロードを行ってください。また、ダウンロードファイルは圧縮ファイルになっていますので、解凍してインストーラを起動します。
制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
「PowerTools ComponentOne Studio 2012J」をインストールしたら、プロジェクトにコントロールを追加します。
ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントはアセンブリ名が「C1.Win.C1FlexGrid.4」の「C1TrueDBGrid」コントロールです。
コントロール | アセンブリ |
C1TrueDBGrid | C1.Win.C1FlexGrid.4 |
また、プロジェクトの参照設定に次のアセンブリへの参照を追加します。これらは、グリッドデータをExcel形式で保存する際に必要になります。
C1TrueDBGridコントロールのエクスポート機能は、C1Reportコンポーネントに含まれるC1PrintPreview/C1PrintDocumentコンポーネントの機能を利用しており、C1Reportコンポーネントのアセンブリを参照する必要があります。
アセンブリ | 説明 |
C1.C1Report.4.dll | 本体アセンブリ(※) |
C1.Win.C1Report.4.dll | 本体アセンブリ(※) |
C1TrueDBGridコントロールのドラッグ&ドロップ機能について
C1TrueDBGridコントロールの機能の概要については、『グリッドコントロールを使いデータベースを操作する.NETアプリケーションを作る』で紹介していますので、そちらをご参照ください。
ここでは、C1TrueDBGridコントロールのドラッグ&ドロップ機能について簡単に紹介しておきます。
C1TrueDBGridコントロールのドラッグ&ドロップ機能
C1TrueDBGridコントロールのドラッグ&ドロップ機能は、複数のグリッド間でデータをドラッグ&ドロップで操作できる機能です。
この機能を使うと、あるグリッドのデータをもう一つのグリッドにマウスで簡単にコピーして新しい表を作成したり、複数のデータベーステーブルのデータからレコードデータを1つずつ選んで別の表にまとめたり、といったことが可能になります。
データベースからデータを抽出する方法にクエリがありますが、クエリはあくまでも条件に一致するデータを取得するものなので、条件に関係なくデータを選んで抽出することはできません。
一方、C1TrueDBGridコントロールのドラッグ&ドロップ機能は、条件に関係なくデータを見ながら必要なデータを選んで取り出すことができます。
データベーステーブルのフィールド内容に関係なく、列数さえ合えば異なるデータのテーブルからもデータを拾い出して1つのグリッドにまとめることが可能です。
次の例は、C1TrueDBGridコントロールのヘルプに記載されている例ですが、それぞれ異なるテーブルデータを表示しているグリッド間で、データをドラッグ&ドロップでコピーしています。
C1TrueDBGridコントロールでドラッグ&ドロップ機能を使用するには、次の手順をとります。
- ドラッグ元のC1TrueDBGridコントロールで、「AllowDrag」プロパティを「True」に設定します。
- ドロップ先のC1TrueDBGridコントロールで、「AllowDrop」プロパティを「True」に設定します。
- ドラッグ元のC1TrueDBGridコントロールのマウスイベントハンドラで、ドラッグ操作の開始点のマウス座標を保存します
- ドラッグ元のC1TrueDBGridコントロールのマウスイベントハンドラで、ドラッグ操作を開始します。
- ドロップ先のC1TrueDBGridコントロールのマウスイベントハンドラで、ドラッグ&ドロップ操作の効果をコピーに指定します。
- ドロップ先のC1TrueDBGridコントロールのマウスイベントハンドラで、グリッドのデータセットに新しい行を追加し、データベースに変更を反映します。
- 次のドラッグ&ドロップに備え、ドラッグ&ドロップ操作をリセット
使用するマウスイベントは、マウスポインタの座標を取得できるイベントハンドラを持っているものを使用します。
今回のアプリケーションでは、ドラッグ元のC1TrueDBGridコントロールでMouseDown・MouseMoveイベントを使用し、ドロップ先のC1TrueDBGridコントロールではDragEnter・DragDropイベントを使用しています。
GUIのデザイン
では、さっそくプログラムを作成しましょう。
作成するプログラムは、C1TrueDBGridコントロールを2つ使用し、1つ目のC1TrueDBGridコントロールでは、SQL Server 2008で作成したサンプルデータベース「都立図書館リスト_Data.mdf」から、テーブル「図書館一覧」にあるデータをすべて取り出しグリッドで表示します。データは、東京都内にある都立図書館の市区町村、所在地、図書館名、電話番号を入力してある、単一のテーブルです。
もう一つのC1TrueDBGridコントロールは、サンプルデータベース「都立図書館リスト_Data.mdf」のテーブル「編集用テーブル」を読み込みます。このテーブルは、フィールドが設定されているだけでデータは入力されていません。空のテーブルになっており、このテーブルをもとにしたグリッドにデータをドラッグ&ドロップして新しい表を作成するようにします。
フォームのデザイン
フォームには、C1TrueDBGridコントロールとButtonコントロールを2つ、Labelコントロールを3つ、SaveFileDialogコントロールを1つ配置します。
C1TrueDBGridコントロールのデータベース連結は設計時に行います。
フォームの作成
まずは、全体のコントロールレイアウトを行います。
(1)フォームに3つのLabelコントロールを配置します。Imageプロパティにアイコン画像「Flag_redHS.png」を設定し、左端に表示します。
(2)C1TrueDBGridコントロールを2つ配置します。データベースの設定とデザインはこのあと行います。
(3)Buttonコントロールを2つ配置し、Clickイベントハンドラを作成します。
(4)SaveFileDialogコントロールを1つ配置し、以下のプロパティを設定します。
プロパティ | 設定値 |
Filter | Excelブック *.xls | *.xls |
DefaultExt | xls |
FileName | 新規作成表.xls |
C1TrueDBGridコントロール「C1TrueDBGrid1」の設定
上に配置したC1TrueDBGrid1コントロールに、データベース連結と外観の装飾を行います。データベースは、テーブル「図書館一覧」の全データを表示するようにします。
(1)スマートタグから「データベースの選択」をクリックし、「プロジェクトデータソースの追加」をクリックします。
(2)データソース構成ウィザードが起動しますので、順番に「データベース」「データセット」を選びます。
(3)データベース接続のページで「新しい接続」をクリックします。
データソースに「Microsoft SQL Serverデータベースファイル」を選択し、データベースファイル名に「都立図書館リスト_Data.mdf」を選びます。「テスト接続」ボタンをクリックし、テスト接続に成功したことを確認したら、ウィザードの次のページに移ります。
(4)データベースのコピーをプロジェクトに入れ、接続文字列を確認し、「次へ」ボタンをクリックします。
テーブルを選択するページに移りますので、テーブル「図書館一覧」をクリックし、データセット名はそのまま「都立図書館リスト_DataDataSet」にして「完了」ボタンをクリックします。
(5)もう一度スマートタグを開き、「VisualStyle」を「Office2007Blue」にし、「行の色を互い違いにする」をクリックします。
(6)プロパティウィンドウで次のプロパティを設定します。
プロパティ | 設定値 |
AllowDrag | True |
BlackColor | 192, 255, 255 |
BorderStyle | Fixed3D |
FlatStyle | Standard |
EvenRowStyle - BackColor | Thistle |
AllowDragプロパティをTrueにすると、C1TrueDBGridコントロールはドラッグ機能が有効になります。
(7)MouseDown・MouseMoveイベントハンドラを作成します。
C1TrueDBGridコントロール「C1TrueDBGrid2」の設定
続いて、データのドロップを受け取るC1TrueDBGridコントロール「C1TrueDBGrid2」の設定を行います。こちらは、データベース「都立図書館リスト_Data.mdf」のテーブル「編集用テーブル」を連結します。
(1)スマートタグから「データベースの選択」をクリックし、「プロジェクトデータソースの追加」をクリックします。データソース構成ウィザードが起動しますので、順番に「データベース」「データセット」を選びます。
(2)「データ接続の選択」ページに移りますので、接続文字列はそのままで「次へ」ボタンをクリックします。
(3)テーブル「編集用テーブル」をクリックし、「データセット名」を「都立図書館リスト_編集用テーブル_DataDataSet」に変更し「完了」ボタンをクリックします。
(4)もう一度スマートタグを開き、「VisualStyle」を「Office2007Black」にし、「行の色を互い違いにする」と「削除を有効にする」をクリックします。
そして、プロパティウィンドウで次のプロパティを設定します。
プロパティ | 設定値 |
AllowDrop | True |
BlackColor | 192, 255, 192 |
BorderStyle | Fixed3D |
FlatStyle | Standard |
EvenRowStyle - BackColor | Bisque |
AllowDropプロパティをTrueにすると、C1TrueDBGridコントロールはドロップ機能が有効になり、データを受け取ることができるようになります。
(5)DragEnter・DragDropイベントハンドラを作成します。
実行コードの作成
フォームが作成できたら、ドラッグ&ドロップの機能を実装します。
コードは、ドラッグ側のC1TrueDBGridコントロールではMouseDown・MouseMoveイベントハンドラに、ドロップ側のC1TrueDBGridコントロールではDragEnter・DragDropイベントハンドラに、それぞれの処理を組み込みます。
グリッドの列幅調整の処理
最初に、フォームのLoadイベントハンドラで2つのグリッドの列幅調節を行います。ドラッグ側のグリッドは列幅をセルのコンテンツに合わせ、ドロップ側のグリッドの列幅は、ドラッグ側の列幅に合わせます。
そして、前回ドラッグアンドドロップしたデータが残っている場合に備え、ドロップ側のグリッドデータを消去します。
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'TODO: このコード行はデータを '都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 'C1TrueDBGrid2用データベース Me.編集用テーブルTableAdapter.Fill(Me.都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル) 'TODO: このコード行はデータを '都立図書館リスト_DataDataSet.図書館一覧' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 'C1TrueDBGrid1用データベース Me.図書館一覧TableAdapter.Fill(Me.都立図書館リスト_DataDataSet.図書館一覧) 'C1TrueDBGrid1の列幅を自動調節 Dim i As Integer For i = 0 To 4 C1TrueDBGrid1.Splits(0, 0).DisplayColumns(i).AllowSizing = True C1TrueDBGrid1.Splits(0, 0).DisplayColumns(i).AutoSize() Next 'C1TrueDBGrid2の列幅をC1TrueDBGrid1の列幅に合わせる For i = 0 To 4 C1TrueDBGrid2.Splits(0, 0).DisplayColumns(i).AllowSizing = True C1TrueDBGrid2.Splits(0, 0).DisplayColumns(i).Width = C1TrueDBGrid1.Splits(0, 0).DisplayColumns(i).Width Next 'グリッドデータが残っている場合は削除する Me.都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル.Clear() End Sub
private void Form1_Load(object sender, EventArgs e) { // TODO: このコード行はデータを '都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 this.編集用テーブルTableAdapter.Fill(this.都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル); // TODO: このコード行はデータを '都立図書館リスト_DataDataSet.図書館一覧' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 this.図書館一覧TableAdapter.Fill(this.都立図書館リスト_DataDataSet.図書館一覧); //C1TrueDBGrid1の列幅を自動調節 int i ; for(i=0;i<=4;i++) { c1TrueDBGrid1.Splits[0, 0].DisplayColumns[i].AllowSizing = true; c1TrueDBGrid1.Splits[0, 0].DisplayColumns[i].AutoSize(); } //C1TrueDBGrid2の列幅をC1TrueDBGrid1の列幅に合わせる for(i=0;i<=4;i++) { c1TrueDBGrid2.Splits[0, 0].DisplayColumns[i].AllowSizing = true; c1TrueDBGrid2.Splits[0, 0].DisplayColumns[i].Width = c1TrueDBGrid1.Splits[0, 0].DisplayColumns[i].Width; } // グリッドデータが残っている場合は削除する this.都立図書館リスト_編集用テーブル_DataDataSet.Clear(); }
ドラッグ側の処理
ドラッグ側のC1TrueDBGridコントロールでは、まずMouseDownイベントハンドラでドラッグがどの行のデータの上で行われたのかを、マウスポインタの座標で把握します。そして、MouseMoveイベントハンドラでドラッグの操作を開始します。Clickイベントハンドラではマウスポインタの座標が把握できませんので、これらのイベントハンドラを利用しています。
(1)MouseDownイベントハンドラでは、C1TrueDBGridクラスのCellContainingメソッドで、マウスボタンが押された時のC1TrueDBGridコントロール上のマウスポインタの座標とグリッドの行列番号を引数の変数に格納します。
e.X, e.Yはドラッグ操作の開始点として使用し、rowはその位置の行番号として使用します。
Private StartDrag_PT As Point Private DragRowNo As Integer Private Sub C1TrueDBGrid1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles C1TrueDBGrid1.MouseDown Dim row, col As Integer StartDrag_PT = Point.Empty DragRowNo = -1 If C1TrueDBGrid1.CellContaining(e.X, e.Y, row, col) Then ' ドラッグ操作の開始点を保存します。 StartDrag_PT = New Point(e.X, e.Y) DragRowNo = row End If End Sub
private Point StartDrag_PT; private int DragRowNo; private void c1TrueDBGrid1_MouseDown(object sender, MouseEventArgs e) { int row, col; StartDrag_PT = Point.Empty; DragRowNo = -1; if(c1TrueDBGrid1.CellContaining(e.X, e.Y, out row, out col)) { // ドラッグ操作の開始点を保存します。 StartDrag_PT = new Point(e.X, e.Y); DragRowNo = row; } }
(2)マウスポインタが動いたらドラッグが開始したと判断し、ドラッグの処理を開始します。
まず、マウスポインタの座標の変化でドラッグが開始したかどうかを判断します。これは、マウスポインタのある座標位置を起点にした矩形を作成し、この座標の変化で判断します。
そして、MarqueeStyleプロパティで行全体を反転表示に切り替え、DoDragDroメソッドを実行します。
このメソッドは、指定された行に対し指定した「DragDropEffect」列挙体のメンバ「コピー」に従ってドラッグ&ドロップ操作を開始します。
Private Sub C1TrueDBGrid1_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles C1TrueDBGrid1.MouseMove 'ドラッグの開始点が空でない場合はラッグが開始されていると判断 If Not StartDrag_PT.IsEmpty Then 'ドラッグ操作の開始点を囲む四角形を 2 ピクセルで作成 Dim rect As New Rectangle(StartDrag_PT, Drawing.Size.Empty) rect.Inflate(2, 2) '3ピクセル以上移動している場合はドラッグ操作を開始 If Not rect.Contains(e.X, e.Y) Then C1TrueDBGrid1.Row = DragRowNo C1TrueDBGrid1.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.HighlightRow C1TrueDBGrid1.DoDragDrop(DragRowNo, DragDropEffects.Copy) End If End If End Sub
private void c1TrueDBGrid1_MouseMove(object sender, MouseEventArgs e) { //ドラッグの開始点が空でない場合はラッグが開始されていると判断 if (!StartDrag_PT.IsEmpty) { //ドラッグ操作の開始点を囲む四角形を 2 ピクセルで作成 Rectangle rect = new Rectangle(StartDrag_PT, Size.Empty); rect.Inflate(2, 2); // 3ピクセル以上移動している場合はドラッグ操作を開始 if (!rect.Contains(e.X, e.Y)) { c1TrueDBGrid1.Row = DragRowNo; c1TrueDBGrid1.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.HighlightRow; c1TrueDBGrid1.DoDragDrop(DragRowNo, DragDropEffects.Copy); } } }
メンバ名 | 説明 |
None | アクションなし。 |
Move | ドラッグ元要素をドラッグ先要素に移動します。 |
Copy | ドラッグ元要素をドラッグ先要素にコピーします。 |
ドロップ側の処理
ドロップ側の処理では、まず、ドロップをコピーで行うように設定します。
次に、DragDropイベントハンドラでグリッドにデータを挿入する処理を実行し、データベーステーブル「編集用テーブル」を更新します。
そして、1件のドラッグ&ドロップ操作が終わったら、次のドラッグ&ドロップ操作に備えドラッグ&ドロップ操作をリセットします。これは、独自のプロシージャ(メソッド)「ResetDragDrop」を作成して処理を実行します。
これは、まず新しい行(追加する行)用のDataRowViewオブジェクトを作成します。そして、この行の各列にドラッグされた行の各列のデータを挿入します。
- DragEnterイベントハンドラでC1TrueDBGridクラスのEffectプロパティにドロップをコピーで行うように設定します。
- DragDropイベントハンドラで、C1TrueDBGrid2コントロールのグリッドのデータセットに新しい行を追加します。
- グリッドのカレントレコードを最後の行に移動します。
- そして、このグリッドデータを元にデータベーステーブル「編集用テーブル」をアップデートします(ただしテーブルは保存しませんので、プログラムを終了するとデータベースのテーブル「編集用テーブル」は空のままです)。
- 次のドラッグ&ドロップ操作に備え、ドラッグ側の強調表示をリセットしてドラッグ&ドロップ操作を取り消します。
- プロシージャ(メソッド)「ResetDragDrop」では、ドラッグ&ドロップ用座標を格納するメンバ変数を初期化し、MarqueeStyleプロパティをデフォルト表示に変更します。
Private Sub C1TrueDBGrid2_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles C1TrueDBGrid2.DragEnter e.Effect = DragDropEffects.Copy '(1) End Sub Private Sub C1TrueDBGrid2_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles C1TrueDBGrid2.DragDrop ' C1TrueDBGrid2のグリッドのデータセットに新しい行を追加します。 Try Dim row As Integer = CInt(e.Data.GetData(GetType(Integer))) Dim mydataviewrow As DataRowView = Me.都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル.DefaultView.AddNew() '(2) mydataviewrow("ID") = C1TrueDBGrid1(row, "ID").ToString() mydataviewrow("市区町村") = C1TrueDBGrid1(row, "市区町村").ToString() mydataviewrow("図書館名") = C1TrueDBGrid1(row, "図書館名").ToString() mydataviewrow("所在地") = C1TrueDBGrid1(row, "所在地").ToString() mydataviewrow("電話番号") = C1TrueDBGrid1(row, "電話番号").ToString() mydataviewrow.EndEdit() C1TrueDBGrid2.MoveLast() '(3) C1TrueDBGrid2.Select() ' データベースに変更を反映 (4) Dim inserted As 都立図書館リスト_編集用テーブル_DataDataSet = Me.都立図書館リスト_編集用テーブル_DataDataSet.GetChanges(DataRowState.Added) If Not (inserted Is Nothing) Then Me.編集用テーブルTableAdapter.Update(inserted) End If Catch ex As System.Exception MessageBox.Show(ex.Message) End Try 'ドラッグ&ドロップ操作をリセット ResetDragDrop() '(5) End Sub Private Sub ResetDragDrop() '強調表示をリセットしてドラッグ&ドロップ操作を取り消す StartDrag_PT = Point.Empty '(6) DragRowNo = -1 C1TrueDBGrid1.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.SolidCellBorder C1TrueDBGrid2.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.SolidCellBorder End Sub
private void c1TrueDBGrid2_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Copy; //(1) } private void c1TrueDBGrid2_DragDrop(object sender, DragEventArgs e) { // C1TrueDBGrid2のグリッドのデータセットに新しい行を追加します。 try { int row = (int)e.Data.GetData(typeof(int)); DataRowView mydataviewrow = this.都立図書館リスト_編集用テーブル_DataDataSet.編集用テーブル.DefaultView.AddNew(); //(2) mydataviewrow["ID"] = c1TrueDBGrid1[row, "ID"].ToString(); mydataviewrow["市区町村"] = c1TrueDBGrid1[row, "市区町村"].ToString(); mydataviewrow["図書館名"] = c1TrueDBGrid1[row, "図書館名"].ToString(); mydataviewrow["所在地"] = c1TrueDBGrid1[row, "所在地"].ToString(); mydataviewrow["電話番号"] = c1TrueDBGrid1[row, "電話番号"].ToString(); mydataviewrow.EndEdit(); c1TrueDBGrid2.MoveLast(); //(3) c1TrueDBGrid2.Select(); // データベースに変更を反映 (4) 都立図書館リスト_編集用テーブル_DataDataSet inserted = (都立図書館リスト_編集用テーブル_DataDataSet)this.都立図書館リスト_編集用テーブル_DataDataSet.GetChanges(DataRowState.Added); if(inserted != null) { this.編集用テーブルTableAdapter.Update(inserted); } }catch(System.Exception ex) { MessageBox.Show(ex.Message); } //ドラッグ&ドロップ操作をリセット ResetDragDrop(); //(5) } private void ResetDragDrop() // 強調表示をリセットしてドラッグ&ドロップ操作を取り消す { StartDrag_PT = Point.Empty; //(6) DragRowNo = -1; c1TrueDBGrid1.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.SolidCellBorder; c1TrueDBGrid2.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.SolidCellBorder; }
ドラッグ選択のキャンセルとExcelブック形式の保存処理
最後に、2つのButtonコントロールのClickイベントハンドラの処理を作成します。
1つは、ドラッグ&ドロップする行を間違えてしまった場合に備え、ドラッグ側のグリッドで一度選択した行のドラッグ機能をキャンセルする処理です。これは、プロシージャ(メソッド)「ResetDragDrop」を呼び出すだけです。
もう一つは、ドロップ側のグリッドをExcelのブックとして保存する処理です。C1TrueDBGridコントロールは、グリッドデータをエクスポートする機能を持っており、その中の一つとしてExcelのワークシートに保存することができます。操作は簡単で、ExportToExcelメソッドを実行するだけです。引数は保存するファイル名です。たったこれだけでグリッドデータをExcelのワークシートに保存することができます。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click ResetDragDrop() End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click '新しいグリッドの内容をExcelブックに保存 If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then C1TrueDBGrid2.ExportToExcel(SaveFileDialog1.FileName) End If End Sub
private void button1_Click(object sender, EventArgs e) { ResetDragDrop(); } private void button2_Click(object sender, EventArgs e) { // 新しいグリッドの内容をExcelブックに保存 if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { c1TrueDBGrid2.ExportToExcel(saveFileDialog1.FileName); } }
まとめ
データベースのフロントエンドアプリケーションといえば、クエリでデータを抽出するのが主ですが、グリッドデータをドラッグ&ドロップして他のグリッドにコピー・移動できる機能は、データを選んで表を作成するのにとても有効です。
しかも、列を指定してデータだけをコピーしますから、異なるフィールドデータでも組み合わせて新しいグリッドを作成することができます。
データベースのデータを自由に組み合わせて表を作成したい時などにはもってこいの機能といえます。
参考資料
- 東京都立図書館ホームページ『都内公立図書館一覧』