トップ回答者
リストビューにデータ追加する方法について

質問
-
こんばんは
リストビューにデータを追加するプログラムの作成でつまづいています。
有識者の方、何卒解決策を教えて下さい。リスト追加手順として下記を考えています。
①リストビューをクリア
②見出し行の作成
③DBからデータを読み出しリストに追加AddRangeメソッドで③を実現したいと思います。
WEBで情報を探していますが、これといったものがなく苦労しています。宜しくお願いします。
'********************************************************************** 'リストビューの初期化 '1行目は見出し(部署コード、部署名、並び順)とする '********************************************************************** Private Sub InitListView() ' ListViewコントロールクリア lstBusyo.Items.Clear() ' ListViewコントロールのプロパティを設定 lstBusyo.FullRowSelect = True lstBusyo.GridLines = True lstBusyo.Sorting = System.Windows.Forms.SortOrder.Ascending lstBusyo.View = View.Details ' 列(コラム)ヘッダの作成 Dim columnCD As New ColumnHeader Dim columnNM As New ColumnHeader Dim columnST As New ColumnHeader columnCD.Text = "部署コード" columnCD.Width = 50 columnNM.Text = "部署名" columnNM.Width = 100 columnST.Text = "並び順" columnST.Width = 50 Dim colHeaderRegValue() As ColumnHeader = {columnCD, columnNM, columnST} lstBusyo.Columns.AddRange(colHeaderRegValue) End Sub '********************************************************************** 'リストの作成 '********************************************************************** Private Sub prcSetList() Dim stbSQL As New System.Text.StringBuilder Dim dtl As DataTable 'シートの内容を描画を非表示 Me.lstBusyo.Clear() 'SQL文を作成 stbSQL.Remove(0, stbSQL.Length) 'stbSQL格納データの消去 stbSQL.Append(vbCrLf & "SELECT BUSYO_CD") stbSQL.Append(vbCrLf & " , BUSYO_NM") stbSQL.Append(vbCrLf & " , SORT_NO") stbSQL.Append(vbCrLf & " FROM KSM_BUSYO") stbSQL.Append(vbCrLf & " ORDER BY SORT_NO") 'SQL実行 dtl = pfncGetDataTable(stbSQL.ToString) 'リストを作成 For intRow = 0 To dtl.Rows.Count - 1 'この部分で良い方法はありませんか? '[リストの1列目] = fncNS(dtl.Rows(intRow).Item("BUSYO_CD")) '[リストの2列目] = fncNS(dtl.Rows(intRow).Item("BUSYO_NM")) '[リストの3列目] = fncNZ(dtl.Rows(intRow).Item("SORT_NO")) Next intRow '終了処理 dtl.Clear() dtl.Dispose() 'シートの内容を描画を表示 Me.lstBusyo.Refresh() End Sub
回答
-
こういうことをやりたいのかな?
Imports System.Linq Public Class Form1 Sub New() InitializeComponent() Me.Controls.Clear() Dim dt As New DataTable dt.Columns.Add("BUSYO_CD") dt.Columns.Add("BUSYO_NM") dt.Columns.Add("SORT_NO") For i As Integer = 0 To 10 Dim r As DataRow = dt.NewRow() r(0) = i.ToString() r(1) = (i * 10).ToString() r(2) = (i * i).ToString() dt.Rows.Add(r) Next Dim listView1 As New ListView listView1.Dock = DockStyle.Fill listView1.View = View.Details Me.Controls.Add(listView1) listView1.BringToFront() For Each clm As DataColumn In dt.Columns listView1.Columns.Add(clm.Caption) Next listView1.Items.AddRange(dt.Rows.Cast(Of DataRow).Select(Function(r) New ListViewItem(r.ItemArray().Select(Function(o) o.ToString()).ToArray())).ToArray()) 'もしくは listView1.Items.AddRange(dt.Rows.Cast(Of DataRow).Select(Function(r) New ListViewItem({fncNS(r(0)), fncNS(r(1)), fncNZ(r(2))})).ToArray()) 'もしくは listView1.Items.AddRange(dt.Rows.Cast(Of DataRow).Select(Function(r) New ListViewItem({fncNS(r("BUSYO_CD")), fncNS(r("BUSYO_NM")), fncNZ(r("SORT_NO"))})).ToArray()) End Sub Private Function fncNS(o As Object) As String Return o.ToString() End Function Private Function fncNZ(o As Object) As String Return o.ToString() End Function End Class
#DataGridViewじゃダメなの?
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
すべての返信
-
あなたが立てた以下のスレッドが放置状態になってます。新しいスレッドを立てるならそれに答えてからにしませんか?
https://social.msdn.microsoft.com/Forums/ja-JP/3b3ec7b0-e558-40bf-a4c3-8314d5c2517b/aspnet-
そのスレッドにも書きましたけど、質問する際は、一番最初に、何を作っているのか(Windows Forms? WPF, ASP.NET Web Forms? その他?)、ご自分の開発環境(OS, .NET, Visual Studio のバージョン、DB サーバーとそのバージョン、ASP.NET Web アプリなら IIS のバージョン、ブラウザは何かなど)に関する情報を最低書いていただけませんか?
-
こういうことをやりたいのかな?
Imports System.Linq Public Class Form1 Sub New() InitializeComponent() Me.Controls.Clear() Dim dt As New DataTable dt.Columns.Add("BUSYO_CD") dt.Columns.Add("BUSYO_NM") dt.Columns.Add("SORT_NO") For i As Integer = 0 To 10 Dim r As DataRow = dt.NewRow() r(0) = i.ToString() r(1) = (i * 10).ToString() r(2) = (i * i).ToString() dt.Rows.Add(r) Next Dim listView1 As New ListView listView1.Dock = DockStyle.Fill listView1.View = View.Details Me.Controls.Add(listView1) listView1.BringToFront() For Each clm As DataColumn In dt.Columns listView1.Columns.Add(clm.Caption) Next listView1.Items.AddRange(dt.Rows.Cast(Of DataRow).Select(Function(r) New ListViewItem(r.ItemArray().Select(Function(o) o.ToString()).ToArray())).ToArray()) 'もしくは listView1.Items.AddRange(dt.Rows.Cast(Of DataRow).Select(Function(r) New ListViewItem({fncNS(r(0)), fncNS(r(1)), fncNZ(r(2))})).ToArray()) 'もしくは listView1.Items.AddRange(dt.Rows.Cast(Of DataRow).Select(Function(r) New ListViewItem({fncNS(r("BUSYO_CD")), fncNS(r("BUSYO_NM")), fncNZ(r("SORT_NO"))})).ToArray()) End Sub Private Function fncNS(o As Object) As String Return o.ToString() End Function Private Function fncNZ(o As Object) As String Return o.ToString() End Function End Class
#DataGridViewじゃダメなの?
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
gakka様
ありがとうございます。提示頂いた内容を試してみようと思います。
DataGridViewはリストの並び替えが容易にできそうなので試そうと思っているのですが、リストをクリックするとセル単位で選択されるような気がしています。実現したい事は、下記ですがDataGridViewでも簡単にできますでしょうか?
・リストは表示のみで編集不可。
・リストの背景色を交互に切り替え(1行目のタイトル行は対象外)
・リストをクリックすると、行単位で選択される。
・クリックした行の項目(たとえば部署コード)を取得し、詳細情報を画面(テキストまたはラベル)を表示する。
-
こんにちは。
どの辺りで躓いたのでしょうか。少し調べた限りでは出来そうですが。
◆編集不可
http://dobon.net/vb/dotnet/datagridview/readonly.html◆背景色交互
http://dobon.net/vb/dotnet/datagridview/alternatingrows.html◆行単位選択
http://www.atmarkit.co.jp/fdotnet/dotnettips/502dgvrowselect/dgvrowselect.html◆選択行の取得
http://dobon.net/vb/dotnet/datagridview/selectedcells.html -
全体的な要件・やりたいことをまとめると以下の通りでいいのですか?
(1) Windows Forms アプリ
(2) クライアント OS Windows 7
(3) VS2010 で開発(ということは .NET 4?)
(4) SQL Server 2008 Express SP2 on Windows Server 2008 R2 Standard
(5) リストに (4) の単一テーブルからデータを取得して表示
・リストは表示のみで編集不可。
・リストの背景色を交互に切り替え(1行目のタイトル行は対象外)
・リストをクリックすると、行単位で選択される。
・クリックした行の項目(たとえば部署コード)を取得し、詳細情報を画面(テキストまたはラベル)を表示する。「リスト」は ListView でなければならないと言うわけではなく、要件がより簡単かつスマートに満たせれば DataGridView など他のコントロールを使うことも可ということのようですね。であれば、ListView ではなくて DataGridView を使う方向に進む方がよさそうだと自分も思います。
しかし、DataGridView に方向転換するなら、このスレッドの表題 ListView の話が終わってから新たに別にスレッドを立てて質問していただけませんか。このフォーラムは「ユーザー同士の情報交換の場所」ということだそうでので、一つのスレッドの Q&A は表題や最初の質問の範囲に限っていただく方がよさそうです。
質問の「AddRangeメソッドで③を実現したいと思います」に対しては他の回答者の方が回答されています。それを試して結果を返答することで話を進めていただければと思います。
-
hige3 さま よろしく。
途中から失礼します。
私もご質問の元々の命題をコード化するなら DataGridView だと思います。
但し、これは、データベースハンドリングとコントロール自身がかなり複雑な為、
検索を頼りながらコーディングしているなら、、先ずは、 ListView をお勧めします。
後日訂正 : 先ずは、 ListView のまま データ取得部分の見直し をお勧めします。
何れ、データの一覧編集等で DataGridView のお世話になるのでしょうから、
その時は、嫌でも覚える事になります。
データベースからデータを持って来る部分が特殊なだけで、
通常の ListView を幾つか書けば、理解出来る筈です。
データベース部分は、以下のものを参照されると良いでしょう。 型付データセット関連。
Visual Studio 2005によるWindowsデータベース・プログラミング:第2回 データセットとデータテーブル
http://www.atmarkit.co.jp/ait/articles/0702/27/news099.html
http://www.atmarkit.co.jp/ait/articles/0702/27/news099_2.html
http://www.atmarkit.co.jp/ait/articles/0702/27/news099_3.html
特に3回目。 (ここ迄 来てしまえば DataGridView の方が楽かもですが。)- 編集済み ShiroYuki_Mot 2015年11月18日 5:50 後続の投稿を受け本文訂正を追記
-
> 但し、これは、データベースハンドリングとコントロール自身がかなり複雑な為、
> 検索を頼りながらコーディングしているなら、、先ずは、 ListView をお勧めします。どうでしょう、そのあたりは目的によるのではないでしょうか?
趣味とか勉強のためと言うことでなくて仕事で開発していると言うことですと、生産性・開発工数・保守工数というところは避けて通れないので、話は違ってくる(Windows Forms アプリなら最初から DataGridView + 型付 DataSet + TableAdapter + TableAdapterManager になる)のではないかと思います。
-
SurferOnWww さま 拝見しました。
ListView で行くにせよ DataGridView で行くにせよ、 先ずは そのままで、
データセットの取得あたりから見直して見ては如何でしょうか と言う提案のつもりでした。
このままの状況で DataGridView に移ると色々と越えねばならない ヤマ がありそうに感じられましたので。
先ずは、 ListView をお勧めします。 > 先ずは、 ListView のまま データ取得部分の見直し をお勧めします。
と言う内容が正確な処でした。 言葉は難しいですね。
- 編集済み ShiroYuki_Mot 2015年11月18日 5:45 <p>タグ追加
-
話がかみ合っていないような気もしますが・・・ 相変わらず質問者さんは出てきませんし・・・
> ListView で行くにせよ DataGridView で行くにせよ、 先ずは そのままで、
> データセットの取得あたりから見直して見ては如何でしょうか と言う提案のつもりでした。その「データセットの取得」とかそれを ListView にバインドするための知識がほとんどないとすると、その知識を習得して自分でコードを書いて問題なく動くようにするには 2 ~ 3 日かかるかもしれませんよね。自分のコーディングで作ったバグを取るにはもっとかかるかも。
仕事でやっていてそんな時間をかけることは許されないということは多分あると思いますが、そうであれば、Visual Studio のデザイナやウィザードを使って知識ゼロでもコーディングレスで 5 分でアプリが作れる方向に進むのがよさそうだということを言ったつもりでした。
-
このスレッドの課題、
> AddRangeメソッドで③を実現したいと思います。
は Gekka さんの回答で解決したのでしょうか? であれば「回答としてマーク」をつけてこのスレッドはクローズしてください。
以下の案内に書いてあるようにこのフォーラムは「ユーザー同士が情報交換を行うための場」として提供されています。なので、質問者さんも情報の共有に協力してください。そのためこのスレッドで質問者さんがやるべきことは、回答者の回答で解決したのか否かの連絡と、解決したのであれば「回答としてマーク」をつけてこのスレッドをクローズすることです。
フォーラムでご質問頂くにあたっての注意点
https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68
質問者さんが立てたもう一つのスレッド(URL 下記)も同様にしてクローズしてください。ASP.net フォーム認証用のパスワード暗号化について
https://social.msdn.microsoft.com/Forums/ja-JP/3b3ec7b0-e558-40bf-a4c3-8314d5c2517b/aspnet- -
フォーラム オペレーターの星 睦美です。hige3 さん、こんにちは。
今回はフォーラム ユーザーからの回答が参考になったようですね。私のほうで[回答の候補としてマーク] させていただきました。フォーラム ユーザーからの回答がお役にたちましたら、回答への投稿者からの[回答としてマーク] をお願いしています。(マークは複数の回答につけることができます。)お忘れのような場合にはのちほどオペレーターからマークさせていただきますね。
それでは今後もフォーラムをよろしくお願いします。
フォーラム オペレーター 星 睦美 - MSDN Community Support