C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ListViewコントロールのItemClickイベント


(過去ログ 91 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■54311 / inTopicNo.1)  ListViewコントロールのItemClickイベント
  
□投稿者/ uooono (4回)-(2010/10/13(Wed) 13:16:28)

分類:[VB.NET/VB2005 以降] 

2010/10/13(Wed) 13:17:23 編集(投稿者)

現在vb6.0からvb2005へコンバージョンを行っています。

ListViewコントロールのItemClickイベントについて質問です。
ヘルプには
「Visual Basic 6.0 の ListView コントロールには、Click イベントと ItemClick イベントがあります。ItemClick イベントは、ListItem オブジェクトを引数として受け取ります。
 Visual Basic 2005 では、ItemClick イベントがなくなりました。代わりに、Click イベントと EventSender.FocusedItem 引数を使用して、クリックされた ListViewItem を判断します。」
とありました。

Clickイベントにすると
Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.Click
となり「EventSender.FocusedItem」引数の使用の方法がいまいちわかりません。例文がヘルプにありませんでした。。。

ListViewのVB6.0でのItemClickイベントに相当するコーディング方法を教えていただきたいです。

(VB6.0)
Private Sub lstvTest_ItemClick(Index As Integer, ByVal Item As MSComctlLib.ListItem)
・・・(処理)・・・
End Sub
(VB.NET)
???

よろしくお願いいたします。
引用返信 編集キー/
■54312 / inTopicNo.2)  Re[1]: ListViewコントロールのItemClickイベント
□投稿者/ shu (100回)-(2010/10/13(Wed) 13:23:53)
No54311 (uooono さん) に返信

Private Sub ListView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.Click
この引数、sender as Objectの事をEventSenderと呼んでます。

この場合、EventSenderはListView1です。

ListView1を直接使うか

Dim lvwTmp as ListView = Directcast(sender, ListView)
としてlvwTmpを使ってもいいです。こうしておくとEventの共有がやりやすいです。

FocusedItemというのはListView上のフォーカスがあるItemを表しています。


引用返信 編集キー/
■54313 / inTopicNo.3)  Re[1]: ListViewコントロールのItemClickイベント
□投稿者/ 魔界の仮面弁士 (1865回)-(2010/10/13(Wed) 13:27:51)
No54311 (uooono さん) に返信
> EventSender.FocusedItem 引数を使用して、クリックされた ListViewItem を判断します。」
これは『イベント引数 sender が返すオブジェクトの FocusedItem プロパティ』の意味です。

すなわち、
 Dim o As ListViewItem = sender.FocusedItem
もしくは、
 Dim o As ListViewItem = ListView1.FocusedItem
です。
引用返信 編集キー/
■54314 / inTopicNo.4)  Re[2]: ListViewコントロールのItemClickイベント
□投稿者/ uooono (5回)-(2010/10/13(Wed) 13:53:00)

早い返信ありがとうございます!
私の混乱はお二人の説明により解決いたしました。

ただ
(vb6.0)
Private Sub lstvTest_ItemClick(Index As Integer, ByVal Item As MSComctlLib.ListItem)

に対する以下のvb.netの紐付けはどのようになるのでしょうか?
(vb.net)
Private Sub lstvTest_Click(ByVal sender As Object, ByVal e As System.EventArgs)

vb6.0の「Item」  ・・・ sender.FocusedItem
vb6.0の「Index」 ・・・ ???

引用返信 編集キー/
■54315 / inTopicNo.5)  Re[3]: ListViewコントロールのItemClickイベント
□投稿者/ shu (101回)-(2010/10/13(Wed) 14:12:08)
No54314 (uooono さん) に返信
> Private Sub lstvTest_ItemClick(Index As Integer, ByVal Item As MSComctlLib.ListItem)
lstvTestがコントロール配列になっていませんか?Indexは配列に対するものです。

配列でない場合のイベント記述は以下のようになるかと思います。
Private Sub lstvTest_ItemClick(ByVal Item As MSComctlLib.ListItem)

引用返信 編集キー/
■54316 / inTopicNo.6)  Re[4]: ListViewコントロールのItemClickイベント
□投稿者/ uooono (7回)-(2010/10/13(Wed) 14:24:00)
No54315 (shu さん) に返信

>>Private Sub lstvTest_ItemClick(Index As Integer, ByVal Item As MSComctlLib.ListItem)
> lstvTestがコントロール配列になっていませんか?Indexは配列に対するものです。

元のvb6.0のソースはshuさんがおっしゃるようにコントロール配列になっていました。
そのために「Index」がついていたのですね。納得。

ただ自動コンバートの結果、このコントロール配列が違うオブジェクト名としてコンバートされています。
同じ名前にしてコントロール配列にしようにもエラーとなります。
vb.netではコントロール配列という概念がなくなったのですか?

引用返信 編集キー/
■54317 / inTopicNo.7)  Re[5]: ListViewコントロールのItemClickイベント
□投稿者/ shu (102回)-(2010/10/13(Wed) 14:41:17)
2010/10/13(Wed) 14:41:48 編集(投稿者)
No54316 (uooono さん) に返信
> ただ自動コンバートの結果、このコントロール配列が違うオブジェクト名としてコンバートされています。
> 同じ名前にしてコントロール配列にしようにもエラーとなります。
> vb.netではコントロール配列という概念がなくなったのですか?
vb6のような実装は出来ません。

vb.netでは配列とかリスト(2005以降)とかを使います。

'--- 変数宣言(クラス変数として定義)
private m_lstList() as ListView           '--- @
or
private m_lstList as List(of ListView)    '--- A


'--- 初期化(New等で実行)
'--- @の場合
m_lstList= new ListView() {ListView1, ListView2, ListView3}
'--- Aの場合
m_lstList = new List(of ListView)
m_lstList.add(ListView1)
m_lstList.add(ListView2)
m_lstList.add(ListView3)

'--- イベント割当(New等で実行)
For each lvwTmp in m_lstList
    AddHandler lvwTmp.Click, Addressof lstvTest_Click
Next lvwTmp


'--- イベント定義(Handlesは不要)
Private Sub lstvTest_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim lvwTmp as ListView = Directcast(sender, ListView)
      ・・・・
End Sub

こんな感じです。

引用返信 編集キー/
■54324 / inTopicNo.8)  Re[5]: ListViewコントロールのItemClickイベント
□投稿者/ 魔界の仮面弁士 (1866回)-(2010/10/13(Wed) 18:19:34)
VB2005 での修正手順については shu さんが書かれていますので、VB6 の面から。


No54316 (uooono さん) に返信
> ただ自動コンバートの結果、このコントロール配列が違うオブジェクト名としてコンバートされています。

元々 VB6 当初から、「コントロール配列」と「コントロール」は別のオブジェクトでした。
(そもそも「コントロール配列」は、名前に反して“配列”ですらありません)


コントロール配列では『MsgBox Text1.Count』や『MsgBox Text1.UBound』と書けますが、
通常のコントロールでは Count メソッドや LBound/UBound メソッドが無い事がその証拠です。

また、そのデータ型を調べてみると、
 Private Sub Command1_Click()
   Debug.Print TypeName(Text1) 'コントロール配列
   Debug.Print TypeName(Text2) 'コントロール
 End Sub
後者は「TextBox」ですが前者は「Object」となる事がわかります。


とはいえ、コントロール配列であってもインデックスを指定して
  Debug.Print TypeName(Text1(0))
とすれば「TextBox」を返します。そのため、ほぼ同列として扱われる事が多いのですが、
たとえばイベントを見てみると、それらは Text1(0) に対して発生するのではなく、
Text1 全体に対して発生しているわけですし、イベント引数の定義を見ても、
Index 引数が付与された「別のイベント プロシージャ」であることがわかります。
(この事は、VB6 でコントロール配列を WithEvents 変数に渡せない理由にも繋がっています)



そして VB.NET の場合、この「コントロール配列オブジェクト」を再現するため、
Microsoft.VisualBasic.Compatibility.VB6 名前空間に、
 ButtonArray
 LabelArray
 TextBoxArray
 ListViewArray
などといったクラスが用意されています。ただし、デザイナ側のサポートは無いため、
これらを利用するには VB6 プロジェクトをコンバートして自動生成させたものに頼るか、
もしくは手動で、TextBox を TextBoxArray に登録するコードを書かなければなりません。

そのため、これらの互換クラスは、あくまで移植用の一時的な物とされています。
http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.compatibility.vb6%28VS.80%29.aspx


一般的には shu さんが書かれているように、自分で配列や List クラス等に登録することで
同様の機能を実現するようにした方が良いと思います。ある程度融通が利きますし。

あわせて、下記も参考になるかと。
http://dobon.net/vb/dotnet/control/buttonarray.html
引用返信 編集キー/
■54327 / inTopicNo.9)  Re[6]: ListViewコントロールのItemClickイベント
□投稿者/ uooono (9回)-(2010/10/13(Wed) 20:26:22)
早い回答ありがとうございます!

とても勉強になりました。
わかりやすい例、リンクの提供ありがとうございました。

解決済み
引用返信 編集キー/
■54416 / inTopicNo.10)  Re[7]: ListViewコントロールのItemClickイベント
□投稿者/ uooono (10回)-(2010/10/19(Tue) 12:23:28)
2010/10/19(Tue) 12:24:49 編集(投稿者)
2010/10/19(Tue) 12:24:43 編集(投稿者)

こんにちは。
解決済みとしていましたが、回答での不明点が一点ありましたので再投稿させていただきます。


>'--- イベント割当(New等で実行)
>For each lvwTmp in m_lstList
> AddHandler lvwTmp.Click, Addressof lstvTest_Click
>Next lvwTmp


>'--- イベント定義(Handlesは不要)
>Private Sub lstvTest_Click(ByVal sender As Object, ByVal e As System.EventArgs)
> Dim lvwTmp as ListView = Directcast(sender, ListView)
>      ・・・・
>End Sub

イベント割り当て時の「lstvTest_Click」の先でインデックスの情報が欲しいのですが可能なのでしょうか?
以下のコーディングであるとうまくいきませんが、意味的には以下のコーディングのようなイメージです。

cnt = 0
For each lvwTmp in m_lstList
AddHandler lvwTmp.Click, Addressof lstvTest_Click(cnt)
cnt = cnt + 1
Next lvwTmp
Private Sub lstvTest_Click(ByVal cnt as short, ByVal sender As Object, ByVal e As System.EventArgs)
msgbox cnt
End Sub

よろしくお願いします。
引用返信 編集キー/
■54417 / inTopicNo.11)  Re[8]: ListViewコントロールのItemClickイベント
□投稿者/ shu (112回)-(2010/10/19(Tue) 12:39:16)
2010/10/19(Tue) 12:47:05 編集(投稿者)

No54416 (uooono さん) に返信
>
> イベント割り当て時の「lstvTest_Click」の先でインデックスの情報が欲しいのですが可能なのでしょうか?
> 以下のコーディングであるとうまくいきませんが、意味的には以下のコーディングのようなイメージです。
>

Array.IndexOf(m_lstList, sender) '--- 配列の場合

m_lstList.IndexOf(sender) '--- List(Of ListView)の場合

でIndexの取得は出来ます。


Tagが空いていればTagに設定しておくという方法もあります。
引用返信 編集キー/
■54419 / inTopicNo.12)  Re[9]: ListViewコントロールのItemClickイベント
□投稿者/ uooono (11回)-(2010/10/19(Tue) 13:06:14)
No54417 (shu さん) に返信
> Array.IndexOf(m_lstList, sender) '--- 配列の場合
>
> m_lstList.IndexOf(sender) '--- List(Of ListView)の場合
>
> でIndexの取得は出来ます。

ありがとうございます。
Array.IndexOfは使用したことがありませんが、このように使うのですね。
助かりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -