.NET TIPS

[ASP.NET]GridView+ObjectDataSourceコントロールでファイル一覧を作成するには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2010/03/04

 ASP.NETでは、さまざまなデータソース・コントロールが提供されている。SQL ServerをはじめとしたデータベースにアクセスするためのSqlDataSourceコントロール、XML文書へのアクセス/変換に特化したXmlDataSourceコントロール、サイトマップ・ファイルへのアクセスに特化したSiteMapDataSourceコントロールなどは、利用する機会も多いはずだ。ASP.NET 3.5ではLINQ to SQLとの連動に特化したLinqDataSourceコントロール、さらに.NET Framework 3.5 SP1ではEntity Frameworkとの連動を意図したEntityDataSourceコントロールなども追加された。

 あまたあるこれらデータソース・コントロールを利用することで、.aspxファイルでは必要最小限のコードでデータベースなどのデータソースと連携できる。そして、これらデータソース・コントロールの中でも秀でて柔軟性に優れ、さまざまな用途に利用できるのがObjectDataSourceコントロールだ。

 ObjectDataSourceコントロールは、名前のとおり、ビジネス・オブジェクト経由で取得したデータをバインドするためのコントロールだ。SqlDataSourceコントロールでは賄えない、ビジネス・ロジックを伴うデータベース・アクセスの用途に利用できるほか、そもそも、既存のデータソース・コントロールでは対応していないデータソースを扱う用途にも利用できる。

 本稿では、ObjectDataSourceコントロールを利用する一例として、ファイル・システム上の特定フォルダに含まれるファイルをオブジェクト経由で読み込み、その結果をGridViewコントロールに展開する方法について紹介する。

 以下は、本稿で作成するサンプルの実行例だ。

カレント・フォルダに含まれるファイルの一覧をグリッド表として整形

 それではさっそく、具体的な手順を追っていこう。

1. データアクセス・クラスを作成する

 ObjectDataSourceコントロールを利用するには、まずデータソースへのアクセスを担当するデータアクセス・クラスを作成しておく必要がある。作成したデータアクセス・クラスは、アプリケーション・ルート直下のApp_Codeフォルダに保存すること。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.ComponentModel;

public class File {
  // ファイル情報を格納するためのプロパティを定義
  public String Name { get; set; }       // ファイル名
  public String Type { get; set; }       // 拡張子
  public long Size { get; set; }         // サイズ
  public DateTime Created { get; set; }  // 作成年月日
  public DateTime Modified { get; set; } // 最終更新日

  // カレント・フォルダのファイル一覧を取得するSELECTメソッド
  [DataObjectMethod(DataObjectMethodType.Select, true)]
  public List<File> GetFiles() {

    var list = new List<File>();
    var Server = HttpContext.Current.Server;

    // カレント・フォルダ配下のファイル一覧を取得
    var dir = new DirectoryInfo(Server.MapPath("."));
    var files = dir.GetFiles();

    // 取得したファイル情報(FileInfoオブジェクト)を
    // Fileオブジェクトに詰め替え
    foreach (FileInfo fl in files) {
      var f = new File();
      f.Name = fl.Name;
      f.Type = fl.Extension;
      f.Size = fl.Length;
      f.Created = fl.CreationTime;
      f.Modified = fl.LastWriteTime;
      list.Add(f);
    }
    // Fileオブジェクトのリストを戻り値として返す
    return list;
  }

  // 指定されたファイルを削除するためのDELETEメソッド
  [DataObjectMethod(DataObjectMethodType.Delete, true)]
  public void Delete(File fl) {

    // Fileオブジェクトから削除対象ファイルの絶対パスを取得
    var Server = HttpContext.Current.Server;
    var path = Server.MapPath("./" + fl.Name);

    // 指定されたファイルを削除
    System.IO.File.Delete(path);
  }
}
Imports Microsoft.VisualBasic
Imports System.IO
Imports System.ComponentModel
Imports System.Collections.Generic

Public Class File
  ' ファイル情報を格納するためのプロパティを定義
  Private _Name As String
  Private _Type As String
  Private _Size As Long
  Private _Created As DateTime
  Private _Modified As DateTime

  ' ファイル名
  Public Property Name() As String
    Get
      Return Me._Name
    End Get
    Set(ByVal value As String)
      Me._Name = value
    End Set
  End Property

  ' 拡張子
  Public Property Type() As String
    Get
      Return Me._Type
    End Get
    Set(ByVal value As String)
      Me._Type = value
    End Set
  End Property

  ' サイズ
  Public Property Size() As String
    Get
      Return Me._Size
    End Get
    Set(ByVal value As String)
      Me._Size = value
    End Set
  End Property

  ' 作成年月日
  Public Property Created() As DateTime
    Get
      Return Me._Created
    End Get
    Set(ByVal value As DateTime)
      Me._Created = value
    End Set
  End Property

  ' 最終更新日
  Public Property Modified() As DateTime
    Get
      Return Me._Modified
    End Get
    Set(ByVal value As DateTime)
      Me._Modified = value
    End Set
  End Property

  ' カレント・フォルダのファイル一覧を取得するSELECTメソッド
  <DataObjectMethod(DataObjectMethodType.Select, True)> _
  Public Function GetFiles() As List(Of File)

    Dim list As New List(Of File)()
    Dim Server = HttpContext.Current.Server

    ' カレント・フォルダ配下のファイル一覧を取得
    Dim dir As New DirectoryInfo(Server.MapPath("."))
    Dim files = dir.GetFiles()

    ' 取得したファイル情報(FileInfoオブジェクト)を
    ' Fileオブジェクトに詰め替え
    For Each fl As FileInfo In files
      Dim f As New File()
      f.Name = fl.Name
      f.Type = fl.Extension
      f.Size = fl.Length
      f.Created = fl.CreationTime
      f.Modified = fl.LastWriteTime
      list.Add(f)
    Next

    ' Fileオブジェクトのリストを戻り値として返す
    Return list
  End Function

  ' 指定されたファイルを削除するためのDELETEメソッド
  <DataObjectMethod(DataObjectMethodType.Delete, True)> _
  Public Sub Delete(ByVal fl As File)

    ' Fileオブジェクトから削除対象ファイルの絶対パスを取得
    Dim Server = HttpContext.Current.Server
    Dim path = Server.MapPath("./" & fl.Name)

    ' 指定されたファイルを削除
    System.IO.File.Delete(path)
  End Sub
End Class
ファイル・システム上のフォルダを読み込むためのデータアクセス・クラス(上:File.cs/下:File.vb)

 データアクセス・クラスでは、データソースの内容を操作するためにSELECT/UPDATE/INSERT/DELETE用のメソッド(データ・メソッド)を指定できる。データ・メソッドは、必ずしもすべての種類を指定する必要はない。例えば、本稿ではデータの取得のみを行いたいので、SELECTメソッドだけを定義している。

 なお、データ・メソッドの引数/戻り値には、それぞれ特定のルールがあるので要注意だ。データ・メソッドに要求される条件をまとめておく。

種類 条件
SELECT 戻り値としてDataSet/ArrayListのようなコレクションを返すこと
UPDATE 引数として更新値を表すオブジェクト、または、更新値を表す個々の値を受け取ること
INSERT 引数として挿入値を表すオブジェクト、または、挿入値を表す個々の値を受け取ること
DELETE 引数として削除時のキーを格納したオブジェクト、または削除キーを表す値を受け取ること
データ・メソッドの条件

 Fileクラスでは、SELECTメソッドとして「カレント・フォルダの内容をList<File>オブジェクトとして返すGetFilesメソッド」を、DELETEメソッドとして「指定されたFileオブジェクトに対応するファイルを削除するDelete」メソッドを、それぞれ定義しているわけだ。

 また、リストの太字部分にも注目してほしい。

 DataObjectMethod属性(System.ComponentModel名前空間)は、データ・メソッドの種類を宣言するものだ。例えばリストでは、

[DataObjectMethod(DataObjectMethodType.Select, true)]
[DataObjectMethod(DataObjectMethodType.Delete, true)]

のように宣言されているので(C#の場合)、対応するメソッドがSELECT/DELETE用途のメソッドであることを表す。第2引数のtrueは、メソッドがデフォルトのSELECT/DELETEメソッドであることを示す。

 DataObjectMethod属性は必須ではないが、明示的に指定しておくことで、後述するデータソース構成ウィザードでも対応するメソッドが自動的に認識されるようになる。コードの可読性を高めるという意味でも、通常は省略せずにきちんと宣言するのが望ましい。

2. グリッド表を作成する

 データアクセス・クラスが用意できたら、あとはこれを.aspxファイルから呼び出してみよう。新規のWebフォーム(FileList.aspx)を作成し、以下の画面のようにGridViewコントロールを配置する。

FileList.aspxのフォーム・レイアウト
以下のコントロールを配置する。
  GridViewコントロール(IDは「list」。オートフォーマットは「スレイト」)。

 GridViewコントロールを配置したら、コントロール右肩のタスク・メニューから[データソースの選択]−[<新しいデータソース>]を選択する。データソース構成ウィザードが起動するので、以下の要領で設定を進めていこう。

[データ ソース構成ウィザード]の[データソースの種類を選びます。]ページ
以下の手順を実行後に[OK]ボタンをクリックする。
  「オブジェクト」を選択。
  「ods」と入力。

 ObjectDataSourceコントロールを利用するには、データソースの種類として「オブジェクト」を選択する。

[データ ソース構成ウィザード]の[ビジネス オブジェクトの選択]ページ
以下の手順を実行後に[次へ]ボタンをクリックする。
  「File」を選択。

 次に、使用するビジネス・オブジェクト(データアクセス・クラス)を聞かれるので、先ほど作成した「File」を選択しておく。あとはデータの取得や削除のために、それぞれ対応するデータ・メソッドを指定するだけだ。

[データメソッドの定義]ダイアログ
[完了]ボタンをクリックする。

 データアクセス・クラスでDataObjectMethod属性が宣言されている場合、[SELECT][DELETE]タブには、それぞれ対応するメソッドが自動で認識されているはずだ。タブを切り替えて、意図したメソッド(GetFiles/Deleteメソッド)が選択されていることを確認しておこう。

3. GridViewコントロールのプロパティを設定する

 データ構成ウィザードを終了したら、GridViewコントロールのタスク・メニューから[削除を有効にする]にチェックを入れる。グリッド表に[削除]リンクが追加されるはずだ。また、プロパティ・ウィンドウからDataKeyNamesプロパティに「Name」と設定しておこう。DataKeyNamesプロパティはデータソースのキーを表すものだ。この値が設定されていないと、削除時にキー(この場合はファイル名)が渡されず、正しくファイルを削除できないので注意されたい。

 以上でデータアクセス・クラスをGridViewコントロールにバインドするための手順は完了だ。サンプルを実行して、カレント・フォルダの内容が以下のようにグリッド表示されていれば成功である。[削除]ボタンをクリックすることで、ファイルの削除が行えることも確認しておこう。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:GridViewコントロール
使用ライブラリ:GridViewコントロール
使用ライブラリ:ObjectDataSourceコントロール
使用ライブラリ:DataObjectMethod属性(System.ComponentModel名前空間)

この記事と関連性の高い別の.NET TIPS
[ASP.NET]GridViewコントロールでデータソースの内容を表示するには?
[ASP.NET]GridViewコントロールにオブジェクトをバインドするには?
[ASP.NET]GridViewコントロールの表示データを特定条件で絞り込むには?
[ASP.NET]メンバシップAPIでユーザー情報の編集を行うには?
[ASP.NET]GridViewコントロールを階層表示させるには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間