none
リストビューにデータ追加する方法について RRS feed

  • 質問

  • こんばんは
    リストビューにデータを追加するプログラムの作成でつまづいています。
    有識者の方、何卒解決策を教えて下さい。

    リスト追加手順として下記を考えています。
    ①リストビューをクリア
    ②見出し行の作成
    ③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
    
    
    

    2015年11月16日 10:24

回答

  • こういうことをやりたいのかな?

    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!)

    • 編集済み gekkaMVP 2015年11月16日 13:28 DataGrid->DataGridView
    • 回答の候補に設定 星 睦美 2015年12月15日 7:37
    • 回答としてマーク 星 睦美 2015年12月22日 7:34
    2015年11月16日 13:22

すべての返信

  • あなたが立てた以下のスレッドが放置状態になってます。新しいスレッドを立てるならそれに答えてからにしませんか?

    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 のバージョン、ブラウザは何かなど)に関する情報を最低書いていただけませんか?

    2015年11月16日 10:38
  • 情報が不足しています事をお詫び申し上げます。

    今回、ある自作システムのマスタ管理画面をVisualBasic2010で作成しようとしてます。
    環境は下記の通りです。
    ・開発言語は、VisualStudio2010Pro Windowsフォームアプリケーション
    ・データデースはSQLServer2008R2 Express Sp2
    ・クライアントOSはWindows7 Pro
    ・サーバOSはWindowsServer2008R2 Stsndardです。

    宜しくお願いします。

    2015年11月16日 12:24
  • こういうことをやりたいのかな?

    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!)

    • 編集済み gekkaMVP 2015年11月16日 13:28 DataGrid->DataGridView
    • 回答の候補に設定 星 睦美 2015年12月15日 7:37
    • 回答としてマーク 星 睦美 2015年12月22日 7:34
    2015年11月16日 13:22
  • gakka様

    ありがとうございます。提示頂いた内容を試してみようと思います。

    DataGridViewはリストの並び替えが容易にできそうなので試そうと思っているのですが、リストをクリックするとセル単位で選択されるような気がしています。実現したい事は、下記ですがDataGridViewでも簡単にできますでしょうか?

    ・リストは表示のみで編集不可。

    ・リストの背景色を交互に切り替え(1行目のタイトル行は対象外)

    ・リストをクリックすると、行単位で選択される。

    ・クリックした行の項目(たとえば部署コード)を取得し、詳細情報を画面(テキストまたはラベル)を表示する。

    2015年11月17日 0:10
  • こんにちは。
    どの辺りで躓いたのでしょうか。

    少し調べた限りでは出来そうですが。

    ◆編集不可
    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

    2015年11月17日 0:21
    モデレータ
  • 全体的な要件・やりたいことをまとめると以下の通りでいいのですか?

    (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メソッドで③を実現したいと思います」に対しては他の回答者の方が回答されています。それを試して結果を返答することで話を進めていただければと思います。

    2015年11月17日 2:31
  • 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 後続の投稿を受け本文訂正を追記
    2015年11月17日 8:14
  • > 但し、これは、データベースハンドリングとコントロール自身がかなり複雑な為、
    > 検索を頼りながらコーディングしているなら、、先ずは、 ListView をお勧めします。

    どうでしょう、そのあたりは目的によるのではないでしょうか?

    趣味とか勉強のためと言うことでなくて仕事で開発していると言うことですと、生産性・開発工数・保守工数というところは避けて通れないので、話は違ってくる(Windows Forms アプリなら最初から DataGridView + 型付 DataSet + TableAdapter + TableAdapterManager になる)のではないかと思います。

    2015年11月17日 8:46
  • SurferOnWww さま 拝見しました。

    ListView で行くにせよ DataGridView で行くにせよ、 先ずは そのままで、
    データセットの取得あたりから見直して見ては如何でしょうか と言う提案のつもりでした。
    このままの状況で DataGridView に移ると色々と越えねばならない ヤマ がありそうに感じられましたので。

    先ずは、 ListView をお勧めします。 > 先ずは、 ListView のまま データ取得部分の見直し をお勧めします。
    と言う内容が正確な処でした。  言葉は難しいですね。

    • 編集済み ShiroYuki_Mot 2015年11月18日 5:45 <p>タグ追加
    2015年11月18日 5:44
  • 話がかみ合っていないような気もしますが・・・ 相変わらず質問者さんは出てきませんし・・・

    > ListView で行くにせよ DataGridView で行くにせよ、 先ずは そのままで、
    > データセットの取得あたりから見直して見ては如何でしょうか と言う提案のつもりでした。

    その「データセットの取得」とかそれを ListView にバインドするための知識がほとんどないとすると、その知識を習得して自分でコードを書いて問題なく動くようにするには 2 ~ 3 日かかるかもしれませんよね。自分のコーディングで作ったバグを取るにはもっとかかるかも。

    仕事でやっていてそんな時間をかけることは許されないということは多分あると思いますが、そうであれば、Visual Studio のデザイナやウィザードを使って知識ゼロでもコーディングレスで 5 分でアプリが作れる方向に進むのがよさそうだということを言ったつもりでした。

    2015年11月18日 6:43
  • SurferOnWww 様
    gekka 様
    Tak1wa 様
    ShiroYuki_Mot 様

    ご教示頂いたサンプルや参考URLを参照しながら、ListViewとDataGridViewの両パターンでプログラムを作成しました。
    結果、DataGridViewの方が使いやすいように思いました。継続して習得していきたいと思います。

    皆様、ご協力ありがとうございました。

    2015年11月19日 0:06
  • このスレッドの課題、

    > 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-

    2015年11月19日 1:03
  • フォーラム オペレーターの星 睦美です。hige3 さん、こんにちは。

    今回はフォーラム ユーザーからの回答が参考になったようですね。私のほうで[回答の候補としてマーク] させていただきました。

    フォーラム ユーザーからの回答がお役にたちましたら、回答への投稿者からの[回答としてマーク] をお願いしています。(マークは複数の回答につけることができます。)お忘れのような場合にはのちほどオペレーターからマークさせていただきますね。

    それでは今後もフォーラムをよろしくお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年12月15日 7:45