vb.netです。
フォームとusercontrolが別になっている状態です。
フォームにボタンがありまして、そのボタンをクリックするとusercontrolを表示します。
ここまでは成功しております。
usercontrolの中にlistviewが置いてありますが、
このlsitviewをフォームのボタンからmoduleを使ってハンドリングができないので
皆様から助けて頂きたいと思います。
1.フォーム側
Private Sub Button1
call F_test() 'listview1のアイテムの個数を数える
end sub
2.usercontrol側
listview1にアイテムが6個入っている状態
3.module側(中身は以下が全てです。)
Public Sub F_test()
Dim xCount = ListView1.Items.Count
MsgBox(xCount)
End Sub
このようにするとうまくいきませんでした。
すみませんが、よろしくお願い致します。
ListView1.Items.Count←コチラの部分ですが、このまま書くとエラーが出ます。
たぶんフォームからmoduleを通してのusercontrolのlistviewまでたどり着いてないと
思いますがその書き方がよくわかりません。
以下に2名様からコメントを頂きましたが、まだ解決できてないのですみませんが、
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
コメントからまとめました。モジュールでやる要望を前提としたコードですが。
tempObjectを何らかの方法で取得する必要がありますね。
簡単なのは退避しておくとか
lang
1Public Class Form1 2 Private current As UserControl '退避しておく 3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 4 Dim tempObject As New UserControl1 5 Panel1.Controls.Clear() 6 tempObject.Dock = DockStyle.Fill 7 tempObject.Visible = False 8 Panel1.Controls.Add(tempObject) 9 '退避しておく 10 current = tempObject 11 End Sub 12 13 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 14 Dim tempObject As New UserControl2 15 Panel1.Controls.Clear() 16 tempObject.Dock = DockStyle.Fill 17 Panel1.Controls.Add(tempObject) 18 '退避しておく 19 current = tempObject 20 End Sub 21 22 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 23 Call F_Test(Me.current) '退避していたインスタンスを渡す 24 End Sub 25End Class 26 27Module Module1 28 Public Sub F_Test(uc As UserControl) 'インスタンスを呼び出し元から受け取る 29 If uc Is Nothing Then Return 30 uc.Visible = True 31 uc.BackColor = Color.Red 32 End Sub 33End Module
あとは名前とか、インデックスとか取得の仕方を決めてやったりとか、
lang
1Public Class Form1 2 3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 4 Dim tempObject As New UserControl1 5 Panel1.Controls.Clear() 6 tempObject.Dock = DockStyle.Fill 7 tempObject.Visible = False 8 Panel1.Controls.Add(tempObject) 9 End Sub 10 11 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 12 Dim tempObject As New UserControl2 13 Panel1.Controls.Clear() 14 tempObject.Dock = DockStyle.Fill 15 Panel1.Controls.Add(tempObject) 16 End Sub 17 18 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 19 '何らかの方法でパネルから取得する。 20 '名前でもいいし順番でもいいが、要件によるしエラーチェックとかも必要 21 Call F_Test(CType(Panel1.Controls(0), UserControl)) 22 End Sub 23End Class
投稿2015/04/28 12:53
総合スコア4791
0
こんにちは。
Moduleで実行したいのであれば処理対象となるUserControlのインスタンスを渡す必要があります。
これがhtsignさんが仰っていることです。
lang
1Public Class Form1 2 3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 4 Call F_test(Me.UserControl11) 5 End Sub 6End Class 7 8Module Module1 9 Public Sub F_test(uc As UserControl1) 10 Dim xCount = uc.ListView1.Items.Count 11 MsgBox(xCount) 12 End Sub 13End Module
ただ、この例では特定のインスタンスに依存した処理であるため、
Moduleに切り出すメリットは無いでしょう。
オブジェクト指向的に考えるとすると、daiveさんが仰っているようにUserControl1クラスが実装する機能とするべきだと思います。
lang
1Public Class Form1 2 3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 4 Me.UserControl11.F_test() 5 End Sub 6End Class 7 8Public Class UserControl1 9 10 Public Sub F_test() 11 Dim xCount = Me.ListView1.Items.Count 12 MsgBox(xCount) 13 End Sub 14End Class
投稿2015/04/27 01:44
総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/28 01:17
2015/04/28 12:11
2015/04/28 12:12
0
先ずは、
Modifiers プロパティ
GenerateMember プロパティ
について、ググってみてください。
その上で、該当ユーザーコントロールに、
必要としている機能があるのか、無いのかを確認した上で、
機能を追加して、List(Of T) の形式などで、データを取得できる様にするのか、
現在の様に、外部コードからユーザーコントロール内の、コントロールのデータを
取得するのかを、考えます。
’
私だったら、
ユーザーコントロールを使うのですから、必要な機能がなければ、
ユーザーコントロールへの機能の追加か、機能の拡張をすると思います。
’
今回の様に、
>2.usercontrol側
>listview1にアイテムが6個入っている状態
を、想定した場合は、
List<Of String> でアイテムを出し入れできるコード
現在選択中の、行列と、アイテムを返すコード
を、ユーザーコントロールに用意すると思います。
投稿2015/04/26 22:31
総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/26 23:31
2015/04/28 01:58
2015/04/28 02:16
2015/04/28 02:17
2015/04/28 02:19
0
あなたの書かれている
lang
1Public uc As New UserControl1 2Public Sub F_test() 3 Dim xCount = uc.ListView1.Items.Count 4 MsgBox(xCount) 5End Sub
は、新たにUserControl1のインスタンスをもう一つ作り、そのプロパティを参照しているだけの別物です。
同じものを共有するためには、ByRefで参照を渡すとかSharedにしてインスタンスを一つに保つなどがありますが、Sharedは個人的にはあまりお勧めしません。
デバッグが難しくなるためです。
F_callプロシージャの具体的な中身が分からないため的外れなことを言っているかもしれません。
投稿2015/04/26 19:09
編集2015/04/26 19:11総合スコア870
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/26 23:32
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/28 16:29