DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コントロールを引数で渡す時の処理について

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 1.1]
分類:[.NET]

【解決したい問題】

初めまして。
初心者ですが、よろしくお願いいたします。


現在、VB6からVB.NETへの移行作業を行っています。

ネットなどで調べたのですが(調べ方が悪いのかもしれませんが・・・)
わからなかったので投稿させていただいています。

--
コントロール(コンボかリストボックス)が引数としてわたって、
処理を行うという関数があります。

例えば、VB.NETでコンボボックスやリストボックスのクリアを行うのは、

 ComboBox1.Items.Clear()

でいいと思うのですが、
引数として渡した関数内で同じように書くと、エラーになってしまって、どうしたらいいのかわかりません。
--

すごく初歩的な質問なのかもしれませんが、
どなたかご教授いただけないでしょうか?
こんにちは、じゃんぬ です。

■No12067に返信(ももさんの記事)
> 引数として渡した関数内で同じように書くと、エラーになってしまって、
> どうしたらいいのかわかりません。

まずは、その部分のソースコードくらいは提示して頂けないでしょうか?
引数をどうやって渡しているのかという説明すらないですよね?

エラー内容も書いておくべきだと思います。
エラーとはコンパイルエラーですか? それとも、例外ですか?
素直に見ると後者の気がします。
NullReferenceException という例外が出ていませんか?
■No12068に返信(じゃんぬねっとさんの記事)
> こんにちは、じゃんぬ です。
>
> ■No12067に返信(ももさんの記事)
>>引数として渡した関数内で同じように書くと、エラーになってしまって、
>>どうしたらいいのかわかりません。
>
> まずは、その部分のソースコードくらいは提示して頂けないでしょうか?
> 引数をどうやって渡しているのかという説明すらないですよね?
>
> エラー内容も書いておくべきだと思います。
> エラーとはコンパイルエラーですか? それとも、例外ですか?
> 素直に見ると後者の気がします。
> NullReferenceException という例外が出ていませんか?

こんにちは。
レスありがとうございます。

書き込み内容が足らなくて申し訳ありませんでした。
下記に、VB6からVB.NETへ置き換えた状態のソースを書きます。

---
Private o_RecordSet As Collection
Private o_ctlComboOrList As System.Windows.Forms.Control

Public Sub Data(ByRef po_Data As System.Windows.Forms.Control, ByRef po_Collection As Collection)
  Dim l_Count As Integer
  Dim o_Col As Collection

  If Not po_Data Is Nothing Then
    o_ctlComboOrList = po_Data
    o_RecordSet = po_Collection
    'レコードの存在確認
    With o_ctlComboOrList
      'コンボボックスのプルダウンデータを削除
      .Clear() 

     ・
     ・
     ・
---

上記の

 .Clear()

は、VB.NETでは使えないようなので、

>>>例えば、VB.NETでコンボボックスやリストボックスのクリアを行うのは、
>>>ComboBox1.Items.Clear()

を真似して、

 .Items.Clear()

と、無理矢理書いたのですが、コンパイルすると

 'Items' は 'System.Windows.Forms.Control' のメンバではありません。

というエラーが出ました。
こんにちは、じゃんぬ です。

■No12079に返信(ももさんの記事)
> と、無理矢理書いたのですが、コンパイルすると
>
>  'Items' は 'System.Windows.Forms.Control' のメンバではありません。
>
> というエラーが出ました。

そのコンパイル エラーどおりです。(^-^;)
System.Windows.Forms.Control に Items というプロパティはありません。
System.Windows.Forms.ComboBox などを使いましょう。
■No12079に返信(ももさんの記事)
コンボボックスやリストボックスを同じ関数で処理したいなら、
TypeOf で型を調べて型変換してから使います。
[VB.NET]
    Public Sub Data(ByRef po_Data As System.Windows.Forms.Control, ByRef po_Collection As Collection)
        If TypeOf po_Data Is ComboBox Then
            Debug.WriteLine(DirectCast(po_Data, ComboBox).Items.Count)
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call Me.Data(Me.ComboBox1, Nothing)
    End Sub
■No12081に返信(るしぇさんの記事)
> コンボボックスやリストボックスを同じ関数で処理したいなら、
> TypeOf で型を調べて型変換してから使います。

ちなみに私はオーバーロードで、コンパイル解決を推奨する派です。(^^)
というより、コントロールをインスタンスごと外に追い出せるようにするのは、
カプセル化の概念からすると、害になると思いますけどね。
実装するのであれば internal にやります。
それと ByRef も使いません。(^^)
■No12082に返信(じゃんぬねっとさんの記事)
> ちなみに私はオーバーロードで、コンパイル解決を推奨する派です。(^^)
Public Sub Data(ByRef po_Data As ComboBox, ByRef po_Collection As Collection)
Debug.WriteLine(po_Data.Items.Count)
End Sub
Public Sub Data(ByRef po_Data As ListBox, ByRef po_Collection As Collection)
Debug.WriteLine(po_Data.Items.Count)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Call Me.Data(Me.ComboBox1, Nothing)
End Sub

…こうかな。
>というより、コントロールをインスタンスごと外に追い出せるようにするのは、
>カプセル化の概念からすると、害になると思いますけどね。
まぁ、確かに(^^;)外部から壊せますしね。そこまで理解して設計して
くれると有難いですが、実際にはなかなか…。
じゃんぬ様、るしぇ様

レスありがとうございました^^
いろいろやり方があるんですね・・・。
どうするのがいいのかとか、まだ全然わかりませんが、
レスを参考に頑張りたいと思います!

今回、お仕事でVB.NETを使用することになって、
スケジュールの関係で勉強する時間もとれないまま、
実作業に入ってしまってかなり焦っています(;w;)

また、投稿させていただくこともあるかと思いますが、
よろしくお願いします。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板