CodeZine(コードジン)

特集ページ一覧

グリッドデータをドラッグ&ドロップで操作し新しい表を作成する.NETアプリケーションを作る

「PowerTools ComponentOne Studio 2012J」のC1TrueDBGridコントロールを使った.NETアプリケーションの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/12/27 14:00

 「PowerTools ComponentOne Studio 2012J」のC1TrueDBGridコントロールを使って、SQL Serverのデータベースから1つずつデータを取り出して新しい表を作成するアプリケーションを作成してみます。

はじめに

 データベースのテーブルからデータを取得する際は主にクエリを使用しますが、クエリはあくまでも設定した条件に一致したデータを一括で抽出するのに使用します。条件さえ設定できれば自動的にデータを取り出せるので大変便利ですが、必要なデータを任意に1つずつ取得して新しいテーブルを作成する、という作業には向いていません。

 「PowerTools ComponentOne Studio 2012J」のC1TrueDBGridコントロールは、複数のグリッド間でドラッグ&ドロップ操作を使用してデータをやり取りする機能を持っています。

 例えば、片方のグリッドでデータベースデータをすべて表示し、そこから必要なデータをドラッグ&ドロップでもう片方のグリッドにコピーするという操作が可能です。

 そこで、今回はこのドラッグ&ドロップ機能を使い、SQL Serverのデータベースから1つずつデータを取り出して新しい表を作成するアプリケーションを作成してみました。

上のグリッドにあるデータを選択し、
上のグリッドにあるデータを選択し、
下のグリッドにドラッグ&ドロップでコピーする
下のグリッドにドラッグ&ドロップでコピーする
作成した表はExcelブック形式で保存する
作成した表はExcelブック形式で保存する

対象読者

 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をアプリケーションと一緒に配布するのと同じです。

 本記事のサンプルアプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。

サンプルファイルの実行に必要なファイル
(※は.NET Framework 4でのみ利用可)
ファイル名 説明
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
アセンブリ名が「C1.Win.C1TrueDBGrid」の「C1TrueDBGrid」コントロール
アセンブリ名が「C1.Win.C1TrueDBGrid」の「C1TrueDBGrid」コントロール

 また、プロジェクトの参照設定に次のアセンブリへの参照を追加します。これらは、グリッドデータをExcel形式で保存する際に必要になります。

 C1TrueDBGridコントロールのエクスポート機能は、C1Reportコンポーネントに含まれるC1PrintPreview/C1PrintDocumentコンポーネントの機能を利用しており、C1Reportコンポーネントのアセンブリを参照する必要があります。

サンプルファイルの実行に必要なファイル
(※は.NET Framework 4でのみ利用可)
アセンブリ 説明
C1.C1Report.4.dll 本体アセンブリ(※)
C1.Win.C1Report.4.dll 本体アセンブリ(※)
「C1.C1Report.4.dll」「C1.Win.C1Report.4.dll」への参照設定を行う
「C1.C1Report.4.dll」「C1.Win.C1Report.4.dll」への参照設定を行う

C1TrueDBGridコントロールのドラッグ&ドロップ機能について

 C1TrueDBGridコントロールの機能の概要については、『グリッドコントロールを使いデータベースを操作する.NETアプリケーションを作る』で紹介していますので、そちらをご参照ください。

 ここでは、C1TrueDBGridコントロールのドラッグ&ドロップ機能について簡単に紹介しておきます。

C1TrueDBGridコントロールのドラッグ&ドロップ機能

 C1TrueDBGridコントロールのドラッグ&ドロップ機能は、複数のグリッド間でデータをドラッグ&ドロップで操作できる機能です。

 この機能を使うと、あるグリッドのデータをもう一つのグリッドにマウスで簡単にコピーして新しい表を作成したり、複数のデータベーステーブルのデータからレコードデータを1つずつ選んで別の表にまとめたり、といったことが可能になります。

 データベースからデータを抽出する方法にクエリがありますが、クエリはあくまでも条件に一致するデータを取得するものなので、条件に関係なくデータを選んで抽出することはできません。

 一方、C1TrueDBGridコントロールのドラッグ&ドロップ機能は、条件に関係なくデータを見ながら必要なデータを選んで取り出すことができます。

 データベーステーブルのフィールド内容に関係なく、列数さえ合えば異なるデータのテーブルからもデータを拾い出して1つのグリッドにまとめることが可能です。

 次の例は、C1TrueDBGridコントロールのヘルプに記載されている例ですが、それぞれ異なるテーブルデータを表示しているグリッド間で、データをドラッグ&ドロップでコピーしています。

異なるテーブルデータを表示しているグリッド間で、
データをドラッグ&ドロップでコピーしている(ヘルプより抜粋)
異なるテーブルデータを表示しているグリッド間で、データをドラッグ&ドロップでコピーしている(ヘルプより抜粋)

 C1TrueDBGridコントロールでドラッグ&ドロップ機能を使用するには、次の手順をとります。

  1. ドラッグ元のC1TrueDBGridコントロールで、「AllowDrag」プロパティを「True」に設定します。
  2. ドロップ先のC1TrueDBGridコントロールで、「AllowDrop」プロパティを「True」に設定します。
  3. ドラッグ元のC1TrueDBGridコントロールのマウスイベントハンドラで、ドラッグ操作の開始点のマウス座標を保存します
  4. ドラッグ元のC1TrueDBGridコントロールのマウスイベントハンドラで、ドラッグ操作を開始します。
  5. ドロップ先のC1TrueDBGridコントロールのマウスイベントハンドラで、ドラッグ&ドロップ操作の効果をコピーに指定します。
  6. ドロップ先のC1TrueDBGridコントロールのマウスイベントハンドラで、グリッドのデータセットに新しい行を追加し、データベースに変更を反映します。
  7. 次のドラッグ&ドロップに備え、ドラッグ&ドロップ操作をリセット

 使用するマウスイベントは、マウスポインタの座標を取得できるイベントハンドラを持っているものを使用します。

 今回のアプリケーションでは、ドラッグ元のC1TrueDBGridコントロールでMouseDown・MouseMoveイベントを使用し、ドロップ先のC1TrueDBGridコントロールではDragEnter・DragDropイベントを使用しています。

GUIのデザイン

 では、さっそくプログラムを作成しましょう。

 作成するプログラムは、C1TrueDBGridコントロールを2つ使用し、1つ目のC1TrueDBGridコントロールでは、SQL Server 2008で作成したサンプルデータベース「都立図書館リスト_Data.mdf」から、テーブル「図書館一覧」にあるデータをすべて取り出しグリッドで表示します。データは、東京都内にある都立図書館の市区町村、所在地、図書館名、電話番号を入力してある、単一のテーブルです。

 もう一つのC1TrueDBGridコントロールは、サンプルデータベース「都立図書館リスト_Data.mdf」のテーブル「編集用テーブル」を読み込みます。このテーブルは、フィールドが設定されているだけでデータは入力されていません。空のテーブルになっており、このテーブルをもとにしたグリッドにデータをドラッグ&ドロップして新しい表を作成するようにします。

サンプルデータベース「都立図書館リスト_Data.mdf」のテーブル「図書館一覧」
サンプルデータベース「都立図書館リスト_Data.mdf」のテーブル「図書館一覧」
テーブル「編集用テーブル」はデータは入力されていない
テーブル「編集用テーブル」はデータは入力されていない

フォームのデザイン

 フォームには、C1TrueDBGridコントロールとButtonコントロールを2つ、Labelコントロールを3つ、SaveFileDialogコントロールを1つ配置します。

 C1TrueDBGridコントロールのデータベース連結は設計時に行います。

フォームのレイアウト
フォームのレイアウト

フォームの作成

 まずは、全体のコントロールレイアウトを行います。

 (1)フォームに3つのLabelコントロールを配置します。Imageプロパティにアイコン画像「Flag_redHS.png」を設定し、左端に表示します。

Imageプロパティにアイコン画像「Flag_redHS.png」を設定し左端に表示する
Imageプロパティにアイコン画像「Flag_redHS.png」を設定し左端に表示する

 (2)C1TrueDBGridコントロールを2つ配置します。データベースの設定とデザインはこのあと行います。

C1TrueDBGridコントロールを2つ配置
C1TrueDBGridコントロールを2つ配置

 (3)Buttonコントロールを2つ配置し、Clickイベントハンドラを作成します。

Buttonコントロールを2つ配置
Buttonコントロールを2つ配置

 (4)SaveFileDialogコントロールを1つ配置し、以下のプロパティを設定します。

プロパティ 設定値
Filter Excelブック *.xls | *.xls
DefaultExt xls
FileName 新規作成表.xls

 

C1TrueDBGridコントロール「C1TrueDBGrid1」の設定

 上に配置したC1TrueDBGrid1コントロールに、データベース連結と外観の装飾を行います。データベースは、テーブル「図書館一覧」の全データを表示するようにします。

 (1)スマートタグから「データベースの選択」をクリックし、「プロジェクトデータソースの追加」をクリックします。

「プロジェクトデータソースの追加」をクリック
「プロジェクトデータソースの追加」をクリック

 (2)データソース構成ウィザードが起動しますので、順番に「データベース」「データセット」を選びます。

 (3)データベース接続のページで「新しい接続」をクリックします。

 データソースに「Microsoft SQL Serverデータベースファイル」を選択し、データベースファイル名に「都立図書館リスト_Data.mdf」を選びます。「テスト接続」ボタンをクリックし、テスト接続に成功したことを確認したら、ウィザードの次のページに移ります。

データソースに「Microsoft SQL Serverデータベースファイル」を選択し、
データベースファイル名に「都立図書館リスト_Data.mdf」を選ぶ
データソースに「Microsoft SQL Serverデータベースファイル」を選択し、データベースファイル名に「都立図書館リスト_Data.mdf」を選ぶ

 (4)データベースのコピーをプロジェクトに入れ、接続文字列を確認し、「次へ」ボタンをクリックします。

 テーブルを選択するページに移りますので、テーブル「図書館一覧」をクリックし、データセット名はそのまま「都立図書館リスト_DataDataSet」にして「完了」ボタンをクリックします。

テーブル「図書館一覧」をクリックしデータセット名は「都立図書館リスト_DataDataSet」
テーブル「図書館一覧」をクリックしデータセット名は「都立図書館リスト_DataDataSet」

 (5)もう一度スマートタグを開き、「VisualStyle」を「Office2007Blue」にし、「行の色を互い違いにする」をクリックします。

「VisualStyle」を「Office2007Blue」にし、「行の色を互い違いにする」をクリック
「VisualStyle」を「Office2007Blue」にし、「行の色を互い違いにする」をクリック

 (6)プロパティウィンドウで次のプロパティを設定します。

プロパティ 設定値
AllowDrag True
BlackColor 192, 255, 255
BorderStyle Fixed3D
FlatStyle Standard
EvenRowStyle - BackColor Thistle

 AllowDragプロパティをTrueにすると、C1TrueDBGridコントロールはドラッグ機能が有効になります。

各プロパティを設定したC1TrueDBGridコントロール
各プロパティを設定したC1TrueDBGridコントロール

 (7)MouseDown・MouseMoveイベントハンドラを作成します。

C1TrueDBGridコントロール「C1TrueDBGrid2」の設定

 続いて、データのドロップを受け取るC1TrueDBGridコントロール「C1TrueDBGrid2」の設定を行います。こちらは、データベース「都立図書館リスト_Data.mdf」のテーブル「編集用テーブル」を連結します。

 (1)スマートタグから「データベースの選択」をクリックし、「プロジェクトデータソースの追加」をクリックします。データソース構成ウィザードが起動しますので、順番に「データベース」「データセット」を選びます。

 (2)「データ接続の選択」ページに移りますので、接続文字列はそのままで「次へ」ボタンをクリックします。

 (3)テーブル「編集用テーブル」をクリックし、「データセット名」を「都立図書館リスト_編集用テーブル_DataDataSet」に変更し「完了」ボタンをクリックします。

テーブル「編集用テーブル」をクリックし、
「データセット名」を「都立図書館リスト_編集用テーブル_DataDataSet」に変更
テーブル「編集用テーブル」をクリックし、「データセット名」を「都立図書館リスト_編集用テーブル_DataDataSet」に変更

 (4)もう一度スマートタグを開き、「VisualStyle」を「Office2007Black」にし、「行の色を互い違いにする」と「削除を有効にする」をクリックします。

 そして、プロパティウィンドウで次のプロパティを設定します。

プロパティ 設定値
AllowDrop True
BlackColor 192, 255, 192
BorderStyle Fixed3D
FlatStyle Standard
EvenRowStyle - BackColor Bisque
「VisualStyle」を「Office2007Black」にし、「行の色を互い違いにする」をクリック
「VisualStyle」を「Office2007Black」にし、「行の色を互い違いにする」をクリック

 AllowDropプロパティをTrueにすると、C1TrueDBGridコントロールはドロップ機能が有効になり、データを受け取ることができるようになります。

 (5)DragEnter・DragDropイベントハンドラを作成します。

実行コードの作成

 フォームが作成できたら、ドラッグ&ドロップの機能を実装します。

 コードは、ドラッグ側のC1TrueDBGridコントロールではMouseDown・MouseMoveイベントハンドラに、ドロップ側のC1TrueDBGridコントロールではDragEnter・DragDropイベントハンドラに、それぞれの処理を組み込みます。

グリッドの列幅調整の処理

 最初に、フォームのLoadイベントハンドラで2つのグリッドの列幅調節を行います。ドラッグ側のグリッドは列幅をセルのコンテンツに合わせ、ドロップ側のグリッドの列幅は、ドラッグ側の列幅に合わせます。

そして、前回ドラッグアンドドロップしたデータが残っている場合に備え、ドロップ側のグリッドデータを消去します。

Visual Basic
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
C#
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はその位置の行番号として使用します。

Visual Basic
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
C#
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」列挙体のメンバ「コピー」に従ってドラッグ&ドロップ操作を開始します。

Visual Basic
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
C#
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);
        }
    }
}
「DragDropEffect」列挙体のメンバ
メンバ名 説明
None アクションなし。
Move ドラッグ元要素をドラッグ先要素に移動します。
Copy ドラッグ元要素をドラッグ先要素にコピーします。

ドロップ側の処理

 ドロップ側の処理では、まず、ドロップをコピーで行うように設定します。

 次に、DragDropイベントハンドラでグリッドにデータを挿入する処理を実行し、データベーステーブル「編集用テーブル」を更新します。

 そして、1件のドラッグ&ドロップ操作が終わったら、次のドラッグ&ドロップ操作に備えドラッグ&ドロップ操作をリセットします。これは、独自のプロシージャ(メソッド)「ResetDragDrop」を作成して処理を実行します。

 これは、まず新しい行(追加する行)用のDataRowViewオブジェクトを作成します。そして、この行の各列にドラッグされた行の各列のデータを挿入します。

  1. DragEnterイベントハンドラでC1TrueDBGridクラスのEffectプロパティにドロップをコピーで行うように設定します。
  2. DragDropイベントハンドラで、C1TrueDBGrid2コントロールのグリッドのデータセットに新しい行を追加します。
  3. グリッドのカレントレコードを最後の行に移動します。
  4. そして、このグリッドデータを元にデータベーステーブル「編集用テーブル」をアップデートします(ただしテーブルは保存しませんので、プログラムを終了するとデータベースのテーブル「編集用テーブル」は空のままです)。
  5. 次のドラッグ&ドロップ操作に備え、ドラッグ側の強調表示をリセットしてドラッグ&ドロップ操作を取り消します。
  6. プロシージャ(メソッド)「ResetDragDrop」では、ドラッグ&ドロップ用座標を格納するメンバ変数を初期化し、MarqueeStyleプロパティをデフォルト表示に変更します。
Visual Basic
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
C#
 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のワークシートに保存することができます。

ドラッグ&ドロップで作成したグリッドをExcelのワークシートに保存することができる
ドラッグ&ドロップで作成したグリッドをExcelのワークシートに保存することができる
Visual Basic
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
C#
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);
    }
}

まとめ

 データベースのフロントエンドアプリケーションといえば、クエリでデータを抽出するのが主ですが、グリッドデータをドラッグ&ドロップして他のグリッドにコピー・移動できる機能は、データを選んで表を作成するのにとても有効です。

 しかも、列を指定してデータだけをコピーしますから、異なるフィールドデータでも組み合わせて新しいグリッドを作成することができます。

 データベースのデータを自由に組み合わせて表を作成したい時などにはもってこいの機能といえます。

参考資料

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5