C# ListViewにDatatableをセットする
保守しているシステムにデータグリッドビューではなくリストビューが使われていることがあります。
ただ、SQLで取得したDatatableをセットする方法がデータグリッドビューとは全く異なります。
Datatableをデータグリッドビューにセットする方法は意外と簡単ですが、
それに慣れていると少し面食らってしまうので、
データグリッドビューと比較しつつ備忘録として残しておこうと思います。
※因みにDatatableをデータグリッドビューにセットする方法これだけです。
dataGridView.DataSource = Datatable;
public void setListViewItems(ListView targetLstv, DataSet dsDataSource)
{
//データのソースとなるDataSet
DataRow drDataSource = new DataTable().NewRow();
drDataSource = dsDataSource.Tables[0].NewRow();
//ListViewItemをインスタンス化
ListViewItem lstvwItems = new ListViewItem();
//テーブルにデータがある場合、リストビューにデータをセット
if (dsDataSource.Tables[0].Rows.Count > 0)
{
//データテーブルのレコード分ループ
for (int i = 0; i; dsDataSource.Tables[0].Rows.Count - 1; i++)
{
//データソースの一行を格納
drDataSource = dsDataSource.Tables[0].Rows[i];
//データテーブルの列数分ループ(列ごとに縦にデータをセットする)
for (int j = 0; j; dsDataSource.Tables[0].Columns.Count; j++)
{
//メインアイテムを設定(リストビュー上の1レコード目)
if (j == 0)
{
lstvwItems = targetLstv.Items.Add(drDataSource[j].ToString());
}
//サブアイテム設定(リストビュー上の2レコード目)
else
{
lstvwItems.SubItems.Add(drDataSource[j].ToString());
}
}
}
}
}
VBは以下のようにセットできます。
If dsResult.Tables(0).Rows.Count > 0 Then
For i As Integer = 0 To dsResult.Tables(0).Rows.Count - 1
For j As Integer = 0 To Me.Columns.Count - 1
If j = 0 Then
'アイテムを追加
Me.Items.Add(dsResult.Tables(0).Rows(i).Item(0).ToString, i)
Else
'サブアイテムを追加
Me.Items(i).SubItems.Add(dsResult.Tables(0).Rows(i).Item(j).ToString)
End If
Next
Next
End If
リストビューとデータグリッドビューとの違いは、ItemsとSubItemsがあるところですね。
1レコード目はItemsに対して値をセットし、
2レコード名以降はSubItemsに値をセットしていく処理になります。
データグリッドビューのようにDataSourceをセットして終わりではありません。
そもそもの話なのですが、
「データグリッドビューとリストビューを使い分ける必要があるの?」
と思われる方も多いと多いかと思います。
機能的な違いは、処理の軽さにあります。
一般的にはDataGridよりもListViewの方が軽量
とされていて、メモリの消費量がListViewの方が軽いようです。
確かに私の保守していたアプリケーションでも表示するレコード数が
業務によっては数千件になることがあり得るのでリストビューが使われていることにも納得です。
<参考URL>
・ListView (GridView) とDataGridの違いについて
https://social.msdn.microsoft.com/Forums/ja-JP/e6d9bdc0-c8d9-4210-82c3-c678dfcbc4ce/listview-gridview-12392datagrid12398369491235612395123881235612390?forum=wpfja
・
