• 検索結果がありません。

ListViewコントロール

N/A
N/A
Protected

Academic year: 2021

シェア "ListViewコントロール"

Copied!
7
0
0

読み込み中.... (全文を見る)

全文

(1)

■ ListView コントロールへ項目を追加 ■

本 稿 で は 、.NET Framework の 標 準 コ ン ト ロ ー ル で 有 る ListView コ ン ト ロ ー ル (System.Windows.Forms 名前空間)を活用する為に、ListView コントロールにデータを追加する方 法を紹介する。 ListView コントロールは、データ項目をアイコン表示や詳細表示等に依り一覧表示する為の物で Windows のエクスプローラでも馴染みのコントロールで有る。其の表示スタイルと仕ては、次の様な 4 種類が用意されている。 ListView コントロールの 4 つの表示スタイル 左から順番に、「大きなアイコン」(LargeIcon)、「小さなアイコン」(SmallIcon)、「一覧」(List)、「詳 細」(Details)と謂う表示に成って居る。詳しくは、MSDN「View 列挙体」を参照され度い。 詳細表示では、1 つのデータ項目に付き複数の種類の情報を列毎に表示出来る。各列の値に依りデータ 項目の並べ替えも可能で有る。 ■ ListView コントロールのヘッダ項目の作成 此処では、ListView コントロールへ実際のデータを追加する前に、先ずは、ListView コントロールの ヘッダ項目を作成する事にする。 猶、上記4 種類の表示スタイルの内、ヘッダ項目が表示されるのは、ListView コントロールの View プ ロパティが、View 列挙体(System.Windows.Forms 名前空間)の Details(詳細表示)に設定されて 居る時而巳で有る。

ヘッダ項目を作成するには、ListView コントロールの Columns プロパティの Add メソッド若しくは AddRange メソッドを使えば良い。複数のヘッダ項目を作成し度い場合には、複数を纏めて追加出来る AddRange メソッドが便利で有る。併し、本稿のサンプルプログラムは、記述が簡単な Add メソッド を利用する事にする(AddRange メソッドを使用する方法は、コメントアウトして居る)。

AddRange メソッドのパラメータには、ColumnHeader オブジェクト(System.Windows.Forms 名前 空間)の配列を指定する。1 つの ColumnHeader オブジェクトが、1 つのヘッダ項目に対応する。

具体的なサンプルコードは、以下の通りで有る。此処ではヘッダ項目と仕て3 つの列を設定して居る。

Visual Basic

' ListView コントロールを初期化するジェネラルプロシージャ Private Sub InitializeListView( )

' ListView コントロールのプロパティ設定 With lsvDisp

L

(2)

.FullRowSelect = True .GridLines = True .Sorting = SortOrder.Ascending .View = View.Details End With ' 列(コラム)ヘッダの作成 lsvDisp.Columns.Add( "名前", 100, HorizontalAlignment.Left ) lsvDisp.Columns.Add( "種類", 60, HorizontalAlignment.Left ) lsvDisp.Columns.Add( "データ", 150, HorizontalAlignment.Left ) ' 下記の様に AddRange メソッドを用いる方法も有る ' Dim C1 As ColumnHeader = New ColumnHeader( ) ' Dim C2 As ColumnHeader = New ColumnHeader( ) ' Dim C3 As ColumnHeader = New ColumnHeader( ) ' C1.Text = "名前" : C1.Width = 100

' C2.Text = "種類" : C2.Width = 60 ' C3.Text = "データ" : C3.Width = 150

' Dim CA( ) As ColumnHeader = { C1, C2, C3 } ' lsvDisp.Columns.AddRange( CA )

End Sub

C#

// ListView コントロールを初期化するメソッド private void InitializeListView( )

{ // ListView コントロールのプロパティ設定 lsvDisp.FullRowSelect = true; lsvDisp.GridLines = true; lsvDisp.Sorting = SortOrder.Ascending; lsvDisp.View = View.Details; // 列(コラム)ヘッダの作成 lsvDisp.Columns.Add( "名前", 100, HorizontalAlignment.Left ); lsvDisp.Columns.Add( "種類", 60, HorizontalAlignment.Left ); lsvDisp.Columns.Add( "データ", 150, HorizontalAlignment.Left ); } 上記コードの詳細説明は割愛するが、最初に ListView コントロールのプロパティ設定で、行選択モー ド(FullRowSelect プロパティ)、グリッド線表示(GridLines プロパティ)、ソート機能(Sorting プ ロパティ)、詳細表示(View プロパティ)の設定を行って居る。更に続けて列(コラム)ヘッダの作成 で、「名前」(列幅:100)、「種類」(列幅:60)、「データ」(列幅:150)と謂う 3 つのカラムを Add メ ソッドに依りヘッダ項目と仕て登録して居る。

※ 此処では、コードに依りヘッダ項目の実装を行ったが、Visual Studio の IDE の[プロパティ]ウィ ンドウに有る「Columns プロパティ」からは、GUI に依り簡単に設定する事も出来る。

■ ListView コントロールへのデータの追加

次に、ListView コントロールへ実際のデータを追加する事にする。

此れには、ListView コントロールの Items プロパティの Add メソッド若しくは AddRange メソッドを 使えば良い。此れに関しても複数を纏めて追加するにはAddRange メソッドを使う。本稿のサンプルコ ードでは、データを1 個宛登録するので、Add メソッドを使用する。

(3)

Add メソッドのパラメータには、ListViewItem オブジェクト(System.Windows.Forms 名前空間)を 指定する。1 つの ListViewItem オブジェクトが、1 つのデータに対応する。 先程のサンプルコードでは3 つの列項目を作ったが、此の場合には、1 つのデータには 3 つの文字列項 目が存在する事に成る。依って、ListViewItem オブジェクトには 3 つの文字列データを含める必要が 有る。此れを実現するには、ListViewItem クラスのコンストラクタのパラメータで、其等を配列と仕 て指定すれば良い。具体的には、以下の様なサンプルコードに成る。 Visual Basic ' ListView コントロールのデータを更新するジェネラルプロシージャ Private Sub RefreshListView( )

' ListView コントロールの総てのデータを消去 lsvDisp.Items.Clear( )

' ListView コントロールにデータを追加

Dim Item1( ) As String = { "リンゴ", "果物", "赤" } lsvDisp.Items.Add( New ListViewItem( Item1 )) Dim Item2( ) As String = { "メロン", "果物", "緑" } lsvDisp.Items.Add( New ListViewItem( Item2 )) Dim Item3( ) As String = { "ピーマン", "野菜", "緑" } lsvDisp.Items.Add( New ListViewItem( Item3 )) End Sub

C#

// ListView コントロールのデータを更新するメソッド private void RefreshListView( )

{ // ListView コントロールの総てのデータを消去 listView1.Items.Clear( ); // ListView コントロールにデータを追加 string[ ] item1 = { "リンゴ", "果物", "赤" };

lsvDisp.Items.Add( new ListViewItem( item1 )); string[ ] item2 = { "メロン", "果物", "緑" };

lsvDisp.Items.Add( new ListViewItem( item2 )); string[ ] item3 = { "ピーマン", "野菜", "緑" }; lsvDisp.Items.Add( new ListViewItem( item3 )); } 上記のコードに有るItems プロパティの Clear メソ ッドは、既存のデータ項目を総て消去する為の物で有 る。 以上のサンプルプログラムを実行したのが次の画面 で有る。 ListView コントロールの詳細表示は、DataGridView コントロールに依るデータ一覧表示に似て居るが、 DataGridView コントロールとは異なり、コントロー ル内で直接、データの編集を行う事は出来ない。 其の分、軽量なので、データを表示する丈で、編集す る必要の無い時は、ListView コントロールを使用し た方が良い。

(4)

■ ListView コントロールでサムネイル画像を一覧表示 ■ 4 種類の表示スタイルを持つ ListView コントロール(System.Windows.Forms 名前空間)では、其の 表示スタイルを「大きなアイコン」にする事に依り、サムネイル画像を一覧表示する事が出来る。本稿 では其の方法に付いて解説し、以下の様な画面のサンプルアプリケーションを作成する事にする。 ListView コントロールに依りサムネイル画像を一覧表示するアプリケーション ボタンがクリックされると、特定のディレクトリに格納されて居るJPEG 画像を ListView コントロー ルに依り一覧表示する。 ■ ImageList コンポーネントと ListViewItem オブジェクト

「大きなアイコン」表示のListView コントロール(View プロパティを View.LargeIcon に設定)に画 像を表示する為には、先ずImageList コンポーネントと ListViewItem オブジェクトとの 2 つを準備す る必要が有る。ImageList コンポーネントは複数の画像を保持する事の出来るコレクションオブジェク トで有る。

此等2 つに関してポイントを纏めると、次の様に成る。

・ImageList コンポーネントのインスタンスを ListView コントロールの LargeImageList プロパティ に設定する。

・ListView コントロールで表示される各項目は、ListViewItem オブジェクトで有る。

・各ListViewItem オブジェクトには、其の表示名と ImageList コンポーネント内の画像のインデック ス番号を指定する。

詰まり、画像を表示するには、ImageList コンポーネントに画像を追加し、其の画像のインデックス番 号を持つListViewItem オブジェクトを作成し、其れを ListView コントロール(の Images プロパティ) に追加すれば良い。

(5)

■ サムネイル画像を一覧表示するアプリケーション

以下に、冒頭で示したアプリケーションのコードを示す。此のコードを実行するには、Visual Studio 2005 で、Windows アプリケーションを新規作成し、ListView コントロール、Button コントロール、 ImageList コンポーネントの 3 つをフォームに配置して置く必要が有る。然して、配置した Button コ ントロールのClick イベントのハンドラを実装する。

Visual Basic

' ボタン(表示)がクリックされた時の処理

Private Sub btnDisp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnDisp.Click

Dim Dr As String = "c:¥windows" ' 画像ディレクトリ Dim Fl As String( ) = System.IO.Directory.GetFiles( Dr, "*.gif" )

Dim W As Integer = 100 Dim H As Integer = 80

imgList.ImageSize = New Size( W, H ) lsvDisp.LargeImageList = imgList

For I As Integer = 0 To ( Fl.Length - 1 ) Dim Org As Image = Bitmap.FromFile( Fl( I )) Dim Dst As Image = CreateThumbnail( Org, W, H ) imgList.Images.Add( Dst ) lsvDisp.Items.Add( Fl( I ), I ) Org.Dispose( ) Dst.Dispose( ) Next End Sub ' サムネイル(幅 W、高さ H の Image オブジェクト)を作成するジェネラルプロシージャ Function CreateThumbnail(ByVal Img As Image, ByVal W As Integer, ByVal H As Integer) _ As Image

Dim Canvas As New Bitmap( W, H )

Dim G As Graphics = Graphics.FromImage( Canvas ) G.FillRectangle(New SolidBrush( Color.White ), 0, 0, W, H )

Dim Fw As Double = CDbl( W ) / CDbl( Img.Width ) Dim Fh As Double = CDbl( H ) / CDbl( Img.Height ) Dim Sc As Double = Math.Min( Fw, Fh )

Dim W2 As Integer = CInt( Img.Width * Sc ) Dim H2 As Integer = CInt( Img.Height * Sc ) G.DrawImage( Img, ( W - W2 ) ¥ 2, ( H - H2 ) ¥ 2, W2, H2 ) G.Dispose( ) Return Canvas End Function

(6)

C#

// ボタン(表示)がクリックされた時の処理

private void btnDisp_Click( object sender, System.EventArgs e ) {

string dr = @"c:¥windows"; // 画像ディレクトリ string[ ] fl = System.IO.Directory.GetFiles( dr, "*.gif" );

int w = 100; int h = 80;

imgList.ImageSize = new Size( w, h ); lstDisp.LargeImageList = imgList;

for (int i = 0; i < fl.Length; i++ ) {

Image org = Bitmap.FromFile( fl[ i ]); Image dst = CreateThumbnail( org, w, h ); imgList.Images.Add( dst ); lstDisp.Items.Add( fl[ i ], i ); org.Dispose( ); dst.Dispose( ); } } // サムネイル(幅 W、高さ H の Image オブジェクト)を作成するメソッド Image CreateThumbnail( Image image, int w, int h)

{

Bitmap canvas = new Bitmap( w, h );

Graphics g = Graphics.FromImage( canvas );

g.FillRectangle( new SolidBrush( Color.White ), 0, 0, w, h );

float fw = ( float )w / ( float )image.Width; float fh = ( float )h / ( float )image.Height;

float scale = Math.Min( fw, fh ); fw = image.Width * scale; fh = image.Height * scale; g.DrawImage( image, ( w – fw ) / 2, ( h – fh ) / 2, fw, fh ); g.Dispose( ); return canvas; }

ListView コントロールで表示される画像のサイズは ImageList コンポーネントの ImageSize プロパテ ィに依り決まり、個々の画像毎に変える事が出来ない。其の為、此のコードでは、予め画像を縮小・拡 大したサムネイル画像を作成して居る。此れを行って居るのがCreateThumbnail メソッドで有る。 因みに、ListView コントロールでは画像の表示間隔も変更出来ない。此の表示間隔は、コントロールパ ネルの「画面」プロパティの[デザイン]タブに有る「アイコンの表示間隔(横)」及び「アイコンの 表示間隔(縦)」で設定されて居る値に依り決定される。

(7)

■ ListView コントロールで項目を選択出来ない様にする ■ Windows フォームの ListView コントロールでは、項目(アイテム)をマウスで選択する事が出来るが、 一覧表示等の目的で項目を選択出来ない様に仕度い場合が有る。Enabled プロパティに false を設定す れば項目は選択出来なく成るが、背景色がグレーに設定され、亦、スクロール等も出来なく成る。猶、 ListView コントロールには ReadOnly と謂ったプロパティは用意されて居ない。 此の様な場合には、ListView コントロールで項目が選択された時に、其の選択をキャンセルする事で、 ListView コントロールを表示専用と仕て観せる事が出来る。 具体的には、ListView コントロールの ItemSelectionChanged イベントハンドラを次の様に記述すれば 良い。ItemSelectionChanged イベントは、其の名の通り、項目の選択状態が変化した時に発生するイ ベントで有る。 Visual Basic ' ItemSelectionChanged イベントハンドラ

Private Sub ListView1_ItemSelectionChanged( ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs ) _ Handles ListView1.ItemSelectionChanged If e.IsSelected Then e.Item.Selected = False ' 項目の選択をキャンセル End If End Sub C# // ItemSelectionChanged イベントハンドラ

private void listView1_ItemSelectionChanged( object sender, ListViewItemSelectionChangedEventArgs e ) { if ( e.IsSelected ) { e.Item.Selected = false; // 項目の選択をキャンセル } } 項目の選択をキャンセルするItemSelectionChanged イベントハンドラ イ ベ ン ト ハ ン ド ラ の 第 2 パラ メ ータ で 有る ListViewItemSelectionChangedEventArgs クラ ス (System.Windows.Forms 名前空間)のオブジェクト(変数 e)では、IsSelected プロパティに依り項 目が選択されたか何うかが解る。

上記リストでは、此れがtrue の場合に、選択されて居る項目の Selected プロパティに false を設定し、 其の選択をキャンセルして居る。

参照

関連したドキュメント

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

The results indicated that (i) Most Recent Filler Strategy (MRFS) is not applied in the Chinese empty subject sentence processing; ( ii ) the control information of the

名称 原材料名 添加物 内容量 賞味期限 保存方法.

[r]

[r]

このうち、放 射化汚 染については 、放射 能レベルの比較的 高い原子炉 領域設備等を対象 に 時間的減衰を考慮す る。機器及び配管の

このうち、放 射化汚 染については 、放射 能レベルの比較的 高い原子炉 領域設備等を対象 に 時間的減衰を考慮す る。機器及び配管の

このうち、放 射化汚 染については 、放射 能レベルの比較的 高い原子炉 領域設備等を対象 に 時間的減衰を考慮す る。機器及び配管の