tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルListViewの項目表示
記事No5613
投稿日: 2007/06/06(Wed) 20:07
投稿者hoido
いつもお世話になっております。
ListViewの使い方でどつぼにはまってしまい不具合から抜け出すことが出来なくなってしまったので
何とかお知恵をお貸しください。
作業内容としてはフォーム内に1ヶ月分のリストビューを作成しその中に詳細の項目を入力する作業
です。
現在のコードは
@1ヵ月分のリストビューを配置する
   Private Sub Balcony_Start()
        Dim f, No0 As Inte
ger
        Dim x, y As Integer
        Dim Type As String = "Ba"

        '週作成
        Fo
r WeekNo = 0 To 4
            LabelFree(0 + WeekNo) = New Label
            With LabelFree(0 + WeekNo)
          
      .Bounds = New Rectangle(New Point(0, 40 + WeekNo * 310), New Size(50, 290))
                .BorderStyle = Bor
derStyle.FixedSingle
                .Text = "DEMO"
            End With
            Me.Pnl_keikaku
.Controls.Add(LabelFree(0 + WeekNo))

            LabelFree(3 + WeekNo) = New Label
            With LabelFree
(3 + WeekNo)
                .Bounds = New Rectangle(New Point(50, 40 + WeekNo * 310), New Size(50, 290))
          
      .BorderStyle = BorderStyle.FixedSingle
            End With
            Me.Pnl_keikaku.Controls.Add(LabelFree(
3 + WeekNo))

            '日作成
            For d As Integer = 0 To 6
                x = (d - 1) * 400
+ 100
                y = WeekNo * 310
                If d = 0 Then GoTo skip

                '日付入力
用Label配置
                LabelDate(No0) = New Label
                With LabelDate(No0)
                  
  .Bounds = New Rectangle(New Point(x, 20 + y), New Size(400, 20))
                    .BorderStyle = BorderStyle.Fix
edSingle
                    .Name = "lbl_day_" & No0
                    .Text = DateAdd(DateIn
terval.Day, No0, StartDay).ToString("M/d")
                End With
                Me.Pnl_keikaku.Con
trols.Add(LabelDate(No0))

                '生産台数合計入力用Label配置
                LabelTotal(No0) =
New Label
                With LabelTotal(No0)
                    .Bounds = New Rectangle(New Point(x, 310 + y),
New Size(400, 20))
                    .BorderStyle = BorderStyle.FixedSingle
                    .Name = "
lbl_Total_" & No0
                End With
                Me.Pnl_keikaku.Controls.Add(LabelTotal(No0
))

                'ListView配置
                ListName(f) = New ListView
                With ListN
ame(f)
                    .Bounds = New Rectangle(New Point(x, 40 + y), New Size(400, 270))
                    .Borde
rStyle = BorderStyle.FixedSingle
                    .HeaderStyle = ColumnHeaderStyle.None
                  
  .Name = "lis_lis" & Type & "_" & No0
                End With

          
      'イベントプロシージャに登録
                Me.Pnl_keikaku.Controls.Add(ListName(f))
                Ad
dHandler ListName(f).MouseUp, AddressOf ListView_MouseUp

                GoTo NextStep

Skip:
  
              '日曜日の場合はここに来る
                LabelDate(No0) = New Label
                With LabelDate(No0
)
                    .Bounds = New Rectangle(New Point(50, 20 + y), New Size(50, 20))
                    .Borde
rStyle = BorderStyle.FixedSingle
                    .Name = "lbl_day_" & No0
                  
  .Text = DateAdd(DateInterval.Day, No0, StartDay).ToString("M/d")
                End With
          
      Me.Pnl_keikaku.Controls.Add(LabelDate(No0))

NextStep:
                f += 1
                No
0 += 1
            Next
        Next
    End Sub

以上長くなってしまって申し訳ありませんが1ヵ月分の
リストビュー及び日付入力用のラベルを配置しています。

A詳細項目の配置
        Dim i, L As Integer
  
      Dim Total As Long

        For L = 0 To 35                    Select Case L
                '日曜日は
とばす
                Case 0, 7, 14, 21, 28, 35
                    GoTo NextStep
            End Select


           'ListViewのフェッダー作成
            With ListName(L)
                If Update_F = True Then
          
          .Clear()
                End If
                .View = View.Details
                .FullRowSelect = T
rue
                .HeaderStyle = ColumnHeaderStyle.None
                .Columns.Add("DEMO1", 45, Horizo
ntalAlignment.Center)
                .Columns.Add("DEMO2", 50, HorizontalAlignment.Center)
                .C
olumns.Add("DEMO3", 100, HorizontalAlignment.Center)
            End With

            '詳細項目追加
処理
            Dim ItemNo As Integer = 0
            Dim S_day As Date
            Dim Select_Day As String = &qu
ot;lbl_day_" & L

            For y As Long = 0 To RET - 1
                S_day = B_edit(y).
seisan_day
                If S_day = Me.Pnl_keikaku.Controls(Select_Day).Text Then

                  
  '詳細項目の追加
                    With ListName(L)
                        .Items.Add(Format(B_edit(y).suetuk
e, "MM/dd"), ItemNo)
                        .Items(ItemNo).SubItems.Add(B_edit(y).type_code)
          
              .Items(ItemNo).SubItems.Add(B_edit(y).name)
                        ItemNo += 1
                  
  End With
                End If
            Next y
   NextStep:
        Next L
    End Sub


上が詳細項目を入力するコードです。
流れ的にはヘッダーの追加⇒B_edit(y)の構造体の中から日付ラベルと同じものだけリスト
ビュー内に配置
といった流れです。

問題はここからなのですが、初回起動時は正常に表示されます。
しかし表示
日付を変更しもう一度表示しようとすると値が正常に表示されません。

初回起動時は
 CALL Balcony_Start
  
CALL Balcony_add

 DEMO1  DEMO2  DEMO3
   5/1    Ba    DEMO
   5/1    Ba    DEMO
   5/1    Ba    DE
MO

2回目以降はリストビューはもう作成されているので日付だけ再描画し
 Update_FをTrueにし
 CALL Bal
cony_add
とすると一番左の行は表示されるのですが2行目以降が表示されません。
 DEMO1  DEMO2  DEMO3
   5/1    
Ba    DEMO
   5/1      
   5/1    
といった感じです。

ながながと申し訳ないのですがどうしてもこの
不具合から抜け出せません。
※もうはまってから2日目です。

何とかお知恵をお貸しください。m(__)m

[ツリー表示へ]
タイトルRe: ListViewの項目表示
記事No5614
投稿日: 2007/06/06(Wed) 20:48
投稿者魔界の仮面弁士
コードが崩れているので、先の投稿を『編集』して、
「図表モード」にて整形しなおしてもらえるとありがたいです。


> 2回目以降はリストビューはもう作成されているので日付だけ再描画し

日付だけを書き換えるなら、ListViewItem の Text プロパティのみを操作すれば良いのでは?

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    'テストとして、3行追加
    With ListView1.Items.Add("5/1")
        .SubItems.Add("aaa")
        .SubItems.Add("bbb")
    End With
    With ListView1.Items.Add("5/2")
        .SubItems.Add("ccc")
        .SubItems.Add("ddd")
    End With
    With ListView1.Items.Add("5/3")
        .SubItems.Add("eee")
        .SubItems.Add("fff")
    End With
End Sub

Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    '2行目のテキストだけ更新
    ListView1.Items(1).Text = "12/31"
End Sub




> とすると一番左の行は表示されるのですが
一番左の「列」ですよね。

[ツリー表示へ]
タイトルRe^2: ListViewの項目表示
記事No5615
投稿日: 2007/06/06(Wed) 23:59
投稿者hoido
魔界の仮面弁士様回答ありがとうございます。

> コードが崩れているので、先の投稿を『編集』して、
現在のコードは
> @1ヵ月分のリストビューを配置する
>    Private Sub Balcony_Start()
>         Dim f, No0 As Integer
>         Dim x, y As Integer
>         Dim Type As String = "Ba"
>
>         '週作成
>         For WeekNo = 0 To 4
>             LabelFree(0 + WeekNo) = New Label
>             With LabelFree(0 + WeekNo)
>             .Bounds = New Rectangle(New Point(0, 40 + WeekNo * 310), New Size(50, 290))
>                 .BorderStyle = BorderStyle.FixedSingle
>                 .Text = "DEMO"
>             End With
>             Me.Pnl_keikaku.Controls.Add(LabelFree(0 + WeekNo))
>
>             LabelFree(3 + WeekNo) = New Label
>             With LabelFree(3 + WeekNo)
>                 .Bounds = New Rectangle(New Point(50, 40 + WeekNo * 310), New Size(50, 290))
>                 .BorderStyle = BorderStyle.FixedSingle
>             End With
>             Me.Pnl_keikaku.Controls.Add(LabelFree(3 + WeekNo))
>
>             '日作成
>             For d As Integer = 0 To 6
>                 x = (d - 1) * 400 + 100
>                 y = WeekNo * 310
>                 If d = 0 Then GoTo skip
>
>                 '日付入力用Label配置
>                 LabelDate(No0) = New Label
>                 With LabelDate(No0)
>                     .Bounds = New Rectangle(New Point(x, 20 + y), New Size(400, 20))
>                     .BorderStyle = BorderStyle.FixedSingle
>                     .Name = "lbl_day_" & No0
>                     .Text = DateAdd(DateInterval.Day, No0, StartDay).ToString("M/d")
>                 End With
>                 Me.Pnl_keikaku.Controls.Add(LabelDate(No0))
>
>                 '生産台数合計入力用Label配置
>                 LabelTotal(No0) = New Label
>                 With LabelTotal(No0)
>                     .Bounds = New Rectangle(New Point(x, 310 + y), New Size(400, 20))
>                     .BorderStyle = BorderStyle.FixedSingle
>                     .Name = "lbl_Total_" & No0
>                 End With
>                 Me.Pnl_keikaku.Controls.Add(LabelTotal(No0))
>
>                 'ListView配置
>                 ListName(f) = New ListView
>                 With ListName(f)
>                     .Bounds = New Rectangle(New Point(x, 40 + y), New Size(400, 270))
>                     .BorderStyle = BorderStyle.FixedSingle
>                     .HeaderStyle = ColumnHeaderStyle.None
>                     .Name = "lis_lis" & Type & "_" & No0
>                 End With
>
>       'イベントプロシージャに登録
>                 Me.Pnl_keikaku.Controls.Add(ListName(f))
>                 AddHandler ListName(f).MouseUp, AddressOf ListView_MouseUp
>
>                 GoTo NextStep
>
> Skip:
>  
>               '日曜日の場合はここに来る
>                 LabelDate(No0) = New Label
>                 With LabelDate(No0)
>                     .Bounds = New Rectangle(New Point(50, 20 + y), New Size(50, 20))
>                     .BorderStyle = BorderStyle.FixedSingle
>                     .Name = "lbl_day_" & No0
>                     .Text = DateAdd(DateInterval.Day, No0, StartDay).ToString("M/d")
>                 End With
>                 Me.Pnl_keikaku.Controls.Add(LabelDate(No0))
>
> NextStep:
>                 f += 1
>                 No0 += 1
>             Next
>         Next
>     End Sub
>
> 以上長くなってしまって申し訳ありませんが1ヵ月分の
> リストビュー及び日付入力用のラベルを配置しています。
>
> A詳細項目の配置
      Private Sub Balcony_add()
>         Dim i, L As Integer
>         Dim Total As Long
>
>         For L = 0 To 35                    
>             Select Case L
>                 '日曜日はとばす
>                 Case 0, 7, 14, 21, 28, 35
>                     GoTo NextStep
>             End Select
>
>            'ListViewのフェッダー作成
>             With ListName(L)
>                 If Update_F = True Then
>                     .Clear()
>                 End If
>                 .View = View.Details
>                 .FullRowSelect = True
>                 .HeaderStyle = ColumnHeaderStyle.None
>                 .Columns.Add("DEMO1", 45, HorizontalAlignment.Center)
>                 .Columns.Add("DEMO2", 50, HorizontalAlignment.Center)
>                 .Columns.Add("DEMO3", 100, HorizontalAlignment.Center)
>             End With
>
>             '詳細項目追加理
>             Dim ItemNo As Integer = 0
>             Dim S_day As Date
>             Dim Select_Day As String = "lbl_day_" & L
>
>             For y As Long = 0 To RET - 1
>                 S_day = B_edit(y).seisan_day
>                 If S_day = Me.Pnl_keikaku.Controls(Select_Day).Text Then
>
>                     '詳細項目の追加
>                     With ListName(L)
>                         .Items.Add(Format(B_edit(y).suetuke, "MM/dd"), ItemNo)
>                         .Items(ItemNo).SubItems.Add(B_edit(y).type_code)
>                         .Items(ItemNo).SubItems.Add(B_edit(y).name)
>                         ItemNo += 1
>                     End With
>                 End If
>             Next y
>      NextStep:
>         Next L
>     End Sub
>
> 以上


申し訳ありませでした。

申し訳ありません。私の説明不足です。

       4/30
DEMO1 DEMO2 DEMO3
5/1    Ba   DEMO
5/1    Ba   DEMO
5/1    Ba   DEMO

作業の内容としては構造体(約500件)のなかから
例として4/30(上記参考)=B_edit(y).seisan_dayのデータのみ抽出しB_edit(y).suetuke、B_edit(y).type_code、B_edit(y).nameの3項目をリストビューに追加していく作業です。
それなのでリストビュー内に表示されるデータはいっさい加工せず、加工する部分としては日付のラベルのみ(上記例題の4/30のところ)のみです。

申し訳ありませんが今一度お願いします。

[ツリー表示へ]
タイトルRe^3: ListViewの項目表示
記事No5629
投稿日: 2007/06/11(Mon) 10:53
投稿者hoido
質問の仕方を変えさせていただきます。
リストビューにおいて3項目追加書き込みを行いたいと思っております。
例)日付、名前、数量
以上3項目を既存のリストビューに追加書き込みを行う
例)
5/1 AAA 10 -----既存項目
5/1 BBB 10 -----追加項目
上記のように行いたいのですが実際処理を行うと
5/1 AAA 10
5/1        -----と追加した項目の日付部分は追加されるのですがそれ以降の項目が追加されません。

実際の処理コード)
  With Select_List
       .Items.Add(ItemName.SubItems(0).Text, ItemC)
       .Items(ItemC).SubItems.Add(ItemName.SubItems(1).Text)
       .Items(ItemC).SubItems.Add(ItemName.SubItems(2).Text)
 End With

前回までと大分質問の仕方を変えましたが悩んでいる問題は同じです。
どうしてリストビューにうまく追加してくれないのでしょう???

どうか対処方教えてください。

[ツリー表示へ]
タイトルRe^4: ListViewの項目表示
記事No5630
投稿日: 2007/06/11(Mon) 13:13
投稿者魔界の仮面弁士
>   With Select_List
>        .Items.Add(ItemName.SubItems(0).Text, ItemC)
>        .Items(ItemC).SubItems.Add(ItemName.SubItems(1).Text)
>        .Items(ItemC).SubItems.Add(ItemName.SubItems(2).Text)
>  End With

Select_List、ItemName、ItemC が何を表わす変数なのかも説明しないと、
掲示板を見ている第三者には伝わりませんよ。(^^;

で。もしも、
 Select_List … ListView
 ItemName    … ListViewItem
という状況なのであれば、変数 ItemC の取り扱いがおかしいです。

最初の .Items.Add(〜, ItemC) で使われている ItemC は、「画像を表わす値」なのに、
以降の .Items(ItemC) で使われている ItemC は、「行を表わす値」なのですから、
この 2 箇所で、同じ変数が使われていること自体が間違いでしょう。


また、既存行の編集ならば、「Add」して新規行を作成する必要はないはずです。
個々の ListViewItem および その SubItems(n) の Text プロパティを書き換えるだけですよね。

[ツリー表示へ]
タイトルRe^5: ListViewの項目表示
記事No5632
投稿日: 2007/06/11(Mon) 14:20
投稿者hoido
魔界の仮面弁士様回答ありがとうございます。
>  Select_List … ListView
>  ItemName    … ListViewItem
> という状況なのであれば、変数 ItemC の取り扱いがおかしいです。
その通りです。すみません。


> 最初の .Items.Add(〜, ItemC) で使われている ItemC は、「画像を表わす値」なのに、
> 以降の .Items(ItemC) で使われている ItemC は、「行を表わす値」なのですから、
> この 2 箇所で、同じ変数が使われていること自体が間違いでしょう。
ItemCは下記の通り現状表示されている行数を変数に代入しています。
ItemC = ListView().Items.Count
また上記に関しましてはこちらのサイトの
ListView コントロールの基本的な操作方法色々(その1)
を参考にさせていただいたつもりです。

現状のリストビュー内容
 With ListName(L)
       .View = View.Details
       .FullRowSelect = True
       .HeaderStyle = ColumnHeaderStyle.None
       .GridLines = True
       .Columns.Add("日付", 45, HorizontalAlignment.Center)
       .Columns.Add("名前", 50, HorizontalAlignment.Center)
       .Columns.Add("数量", 100, HorizontalAlignment.Center)
 End With


> また、既存行の編集ならば、「Add」して新規行を作成する必要はないはずです。
> 個々の ListViewItem および その SubItems(n) の Text プロパティを書き換えるだけですよね。
今回行いたい作業は既存のリストビューに新規に行を追加したいと思っておりました。
例-現状)
日付 名前 数量
5/1  aaa    1
例-追加作業後)
日付 名前 数量
5/1  aaa    1
5/2   bbb    1 ---この行を既存のリストビューに新規で追加作業を行いたい

不具合内容)
日付 名前 数量
5/1  aaa    1
5/2        ---この様に一番左の列の項目のみ表示される
このときDebug.Printを使用し中身を確認するとちゃんと "5/2   bbb    1" と変数に格納されています。
しかし画面上には項目が表示されません。リストビューの何かの設定が足りないのでしょうか。
私の説明不足の為何度もご足労おかけしておりますがもう一度ご指導のほどお願いいたします。よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^6: ListViewの項目表示
記事No5633
投稿日: 2007/06/11(Mon) 15:31
投稿者るしぇ
プログラムが鬱陶しいです。

> それなのでリストビュー内に表示されるデータはいっさい加工せず、加工する部分としては日付のラベルのみ
リストビュー1つとラベル1つを使いまわせばできることです。
無駄が多くてうんざりします。少なくとも、質問掲示板に投稿するコードではありません。

今はリストビューで、2行目の2列目以降に表示されないのが問題なのですね?
それなら、ラベルの処理をすべて削除して欲しいです。
# というか、新規リストビュー1つとラベル1つで質問すれば十分なはず。

> このときDebug.Printを使用し中身を確認するとちゃんと "5/2   bbb    1" と変数に格納されています。
何の中身なのかが抜けてます。しかも何故1つの文字列なのでしょう?
 .Items(ItemC).Text
 .Items(ItemC).SubItems(1).Text
 .Items(ItemC).SubItems(2).Text
・・・と、複数のアイテムとサブアイテムに格納しているはずですよね?

[ツリー表示へ]
タイトルRe^6: ListViewの項目表示
記事No5635
投稿日: 2007/06/11(Mon) 17:45
投稿者魔界の仮面弁士
> ItemCは下記の通り現状表示されている行数を変数に代入しています。
> ItemC = ListView().Items.Count
ItemC は「その時点での ListView の行数」を意味しているのですね。
だとすれば、
> .Items.Add(ItemName.SubItems(0).Text, ItemC)
この部分がおかしいです。

まず、ここで指定している「ItemName」という ListViewItem が、どの行を指しているのかが謎です。
既存行を表す変数なのであれば、何行目を表しているのか、その取得部分の説明がありませんし、
新規行を表す変数なのであれば、ここで Items.Add() でさらに作成する意味はありませんよね。

また、第2引数に指定された ItemC も奇妙です。ItemC には行数が入っているので、おそらくは
「行の位置を指定して、新規行を追加」という意図で書かれたのかと想像しますが、実際のところ、
.Items.Add(String, Integer) メソッドの第 2 引数は、行の位置を表わす引数ではなく、
各行に表示する「アイコン」を指定するためのものだからです。

今回、アイコンは関係無いのですから、ItemC を指定する必要はありません。
(もしアイコンを表示したいのであれば、ItemC を指定するのは間違いでしょう)


> .Items(ItemC).SubItems.Add(ItemName.SubItems(1).Text)
ここで指定している .Items(ItemC) が、どの行を表しているのかを再確認すべきかと。
もし既存行だとしたら、ここの Add により、4列目以降ができてしまいますから…。


>  5/2   bbb    1 ---この行を既存のリストビューに新規で追加作業を行いたい
新規行の作り方は、No.5614 で回答したとおりです。すなわち、
 Dim newItem As ListViewItem = ListView1.Items.Add("5/2")
 newItem.SubItems.Add("bbb")
 newItem.SubItems.Add("1")
ですよね。

> 日付 名前 数量
>  5/1  aaa    1
>  5/2        ---この様に一番左の列の項目のみ表示される
> このときDebug.Printを使用し中身を確認すると
Debug.Print …ということは、VB2005 なのですね。

> ちゃんと "5/2   bbb    1" と変数に格納されています。
2列目(名前) と 3列目(数量) が空っぽで、誤って 4列目に bbb、5列目に 1 と追加されてはいませんか?

[ツリー表示へ]
タイトルRe^7: ListViewの項目表示
記事No5636
投稿日: 2007/06/12(Tue) 08:56
投稿者hoido
魔界の仮面弁士様、るしぇ様回答ありがとうございました。
無事解決することが出来ました。
今後ともよろしくお願いいたします。<m(__)m>

[ツリー表示へ]