tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルxmlファイル作成
記事No1320
投稿日: 2005/01/21(Fri) 15:09
投稿者さち
[OSのVer]:Windows XP   [VBのVer]:VB.NET 

こんにちは
XMLファイルを作成するところでつまづいてしまいました
どなたかお詳しい方が入らしたら知恵を貸して下さい。

今フォーム上にコンボボックス15、それぞれの横にテキストボックス15個あります
このそれぞれの値をXMLファイルの要素、属性にしたいと思ってます。
具体的にcomboBox1の値を <comboBox1 atb = "comboBox1の値">textBox1の値</c
omboBox1>
と言う風にしたいのですがなんとかfor〜nextを使用して
comboBox1からcomboBox15を一度に出来ないものかと思い下記のようなコードを記述しました。
すると
System.MissingMemberException: 型 'String' でパブリック メンバ 'Text' が見つかりません。
   at Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType,
String name, Object[] args, String[] paramnames, Boolean[] CopyBack)
とのエラーメッセージが現れるのですがちなみに
エラーの場所は
.WriteAttributeString("atb","", comboBoxi.Text)の所のようです。

どなたかお気づきの点がございましたら
教えて頂けないでしょうか。
よろしくお願いします。

Dim xWriter As XmlTextWriter
xWriter = New XmlTextWriter("abc.xml",System.Text.Encoding.GetEncoding("Shif
t_jis"))
Dim i As Integer
Dim comboBoxi As Object
Dim textBoxi As Object

With xWriter
For i = 1 To 15
.WriteStartElement("textBox" & i)
comboBoxi = "comboBox" & i
.WriteAttributeString("atb","", comboBoxi.Text)
textBoxi = "textBox" & i
.WriteString(textBoxi.Text)
.WriteEndElement()                        
Next i




End With
 

[ツリー表示へ]
タイトルRe: xmlファイル作成
記事No1321
投稿日: 2005/01/21(Fri) 15:17
投稿者るしぇ
>      comboBoxi = "comboBox" & i
comboBoxi に入るのはただの文字列 "comboBox1" で
フォームに乗ってるコンボボックスコントロールとは
何の関係もありません。
テキストボックスも同様です。
>    Dim comboBoxi As Object
>    Dim textBoxi As Object
なんでもかんでも Object 型を使うのは感心しません。
        Dim comboBoxi As ComboBox
        Dim textBoxi As TextBox
と直せば質問のコードがコンパイルさえ通らないコードで
ある事が分かります。

いくつか方法はあるけど、とりあえず↓
[参考]
hhttp://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200412/04120067.txt
特攻隊長まるるうさんのコードは難易度低め、初心者でも理解できるものの
ベタ書きで設定しないといけない項目がいくつかあります。
ねろさんのコードは、その部分を自分でコントロールを動的に追加して解消して
います。…が、難易度高め。

[ツリー表示へ]
タイトルRe^2: xmlファイル作成
記事No1323
投稿日: 2005/01/21(Fri) 16:17
投稿者さち
るしぇさん早速のお返事ありがとうございました。
リンクも拝見させていただきました
るしぇさんのおっしゃること、またリンクに関しても
なんとなくですがおっしゃりたいことは判るのですが
やっぱりいずれのコードも私にはハードルが高いようです。
もう少しじっくりと詠んでみたいと思います。
ありがとうございます。

[ツリー表示へ]
タイトルRe: xmlファイル作成
記事No1322
投稿日: 2005/01/21(Fri) 16:08
投稿者aki
[OSのVer]:Windows    [VBのVer]:VB.NET  

最悪の場合、↓のようにすれば可能です。
ただし、すっごく厳しい条件があります。
そのフォームにコントロールを増やせないこと。(^_^;)
っと、textBox15,comboBox15,textBox14,comboBox14
・・・・・textBox2,comboBox2,textBox1,comboBox1,Button1
の順番を確実にまもってフォームにのせていかなくては
いけません。(爆)
最後のボタンはMe.Controls(0)にあたるので、下記コードの場合
必要になります。(カウントの問題だけですが。)

        Dim xWriter As XmlTextWriter
        xWriter = New XmlTextWriter("abc.xml", System.Text.Encoding.GetEncoding(&qu
ot;Shift_jis"))
        Dim i As Integer
        Dim comboBoxi As ComboBox ' Object
        Dim textBoxi As TextBox ' Object

        With xWriter
            For i = 1 To 15
                .WriteStartElement("textBox" & i)
                comboBoxi = Me.Controls(i) '"comboBox" & i
                .WriteAttributeString("atb", "", comboBoxi.Text)
                textBoxi = Me.Controls(i * 2) '"textBox" & i
                .WriteString(textBoxi.Text)
                .WriteEndElement()
            Next i
        End With

[ツリー表示へ]
タイトルRe^2: xmlファイル作成
記事No1324
投稿日: 2005/01/21(Fri) 16:25
投稿者るしぇ
面白いコードだw
名前の付け方とかに制限は残るけど、↓こんな考え方でカバーできそうかな?
        Dim comboBoxi As ComboBox
        Dim textBoxi As TextBox
        Dim wCtrl As Control

        For Each wCtrl In Me.Controls
            If wCtrl.Name.StartsWith("comboBox") Then
                comboBoxi = DirectCast(wCtrl, ComboBox)
            ElseIf wCtrl.Name.StartsWith("textBox") Then
                textBoxi = DirectCast(wCtrl, TextBox)
            End If
        Next

…あー、でも↑だと comboBoxi に対応する textBoxi を探さないといけないのか…
もう一工夫必要だねぇ…

[ツリー表示へ]
タイトルRe^3: xmlファイル作成
記事No1326
投稿日: 2005/01/21(Fri) 16:37
投稿者aki
[OSのVer]:Windows    [VBのVer]:VB.NET  

いや、コンボボックスとテキストボックスが交互に配置されていないと
思い通りの順番にならないと・・・。

        Dim comboBoxi As ComboBox
        Dim textBoxi As TextBox
        Dim wCtrl As Control
        Dim i As Integer

        For i = 0 to 15
            For Each wCtrl In Me.Controls
                If wCtrl.Name = "comboBox" & i.ToString Then
                    comboBoxi = DirectCast(wCtrl, ComboBox)
                ElseIf wCtrl.Name = "textBox" & i.ToString Then
                    textBoxi = DirectCast(wCtrl, TextBox)
                             ・
                             ・
                             ・
                             ・

                End If
            Next
        Next i

っと書くぐらいなら普通に地道に順番に(笑)書いていったほうが
早いような気がします・・・。(^_^;)

[ツリー表示へ]
タイトルRe^4: xmlファイル作成
記事No1328
投稿日: 2005/01/21(Fri) 17:01
投稿者るしぇ
> っと書くぐらいなら普通に地道に順番に(笑)書いていったほうが
> 早いような気がします・・・。(^_^;)
うん、理解してる(^^)。Me.Controls を使う時点で
>        For i = 0 to 15
を外したかったのよね。

フォームのロードあたりで
        ComboBox1.Tag = TextBox1
とかやって
        For Each wCtrl In Me.Controls
            If wCtrl.Name.StartsWith("comboBox") Then
                comboBoxi = DirectCast(wCtrl, ComboBox)
                textBoxi = DirectCast(comboBoxi.Tag, TextBox)
            End If
        Next
とか、
ループ1回まわしてテキストボックスの値を全て回収して
もう一回のループで処理とか…色々考えたけど…まぁ、いまいち
なのしか完成しませんでしたので(汗)…駄レスすまソ。

[ツリー表示へ]
タイトル度々すみません
記事No1344
投稿日: 2005/01/26(Wed) 16:02
投稿者さち
こういうことなのかと思って
↓のようなコードを書いたのですが
やっぱりダメでした。
mComboBoxes(0) = comboBox1
の一文のcomboBox1は代入されていないのでしょうか?
下記のようなメッセージが出たのですがお気づきの点など
ありましたら教えてください。よろしくお願いします。


Sub MakingXml()    
    Dim mComboBoxes() As ComboBox
        mComboBoxes(0) = comboBox1
        mComboBoxes(1) = comboBox2
        mComboBoxes(2) = comboBox3
    mComboBoxes(3) = comboBox4
    mComboBoxes(4) = comboBox5
    mComboBoxes(5) = comboBox6
    mComboBoxes(6) = comboBox7
    mComboBoxes(7) = comboBox8
    mComboBoxes(8) = comboBox9
    mComboBoxes(9) = comboBox10
    mComboBoxes(10) = comboBox11
    mComboBoxes(11) = comboBox12
    mComboBoxes(12) = comboBox13
    mComboBoxes(13) = comboBox14
    mComboBoxes(14) = comboBox15

    Dim mtextBoxes() As textBox      
        mtextBoxes(0) = textBox1
        mtextBoxes(1) = textBox2
        mtextBoxes(2) = textBox3
    mtextBoxes(3) = textBox4
    mtextBoxes(4) = textBox5
    mtextBoxes(5) = textBox6
    mtextBoxes(6) = textBox7
    mtextBoxes(7) = textBox8
    mtextBoxes(8) = textBox9
    mtextBoxes(9) = textBox10
    mtextBoxes(10) = textBox11
    mtextBoxes(11) = textBox12
    mtextBoxes(12) = textBox13
    mtextBoxes(13) = textBox14
    mtextBoxes(14) = textBox15
        
    Dim xWriter As XmlTextWriter                

    xWriter = New XmlTextWriter("sorce/appli.xml", System.Text.Encoding.GetEncod
ing
("Shift_jis"))
    With xWriter
    .Formatting = Formatting.Indented
    .Indentation = 3
    .WriteProcessingInstruction("xml", "version='1.0' encoding='Shift_jis'&
quot;)
                    
     .WriteStartElement("A")
                        
     .WriteStartElement("B")
     .WriteString(textBox1.Text)                        
                    
    Dim i As Integer
    For i = 1 To 15
    .WriteStartElement(mComboBoxes(i).Text)
    .WriteString(mtextBoxes(i).Text)
    .WriteEndElement()
    Next i
                        
    .WriteEndElement()
    .WriteEndElement()                                
                            
    .Flush()
    .Close()
     End With    
                  
End Sub

************** 例外テキスト **************
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていませ
ん。
at register.MainForm.MakingXml() in C:\My Documents\SharpDevelop
Projects\register\MainForm.vb:line 608

[ツリー表示へ]
タイトルRe: 度々すみません
記事No1345
投稿日: 2005/01/26(Wed) 16:43
投稿者るしぇ
>Dim mComboBoxes() As ComboBox
エラーメッセージの通り、インスタンスが生成されていません。
  Dim mComboBoxes(14) As ComboBox
とするか
  Dim mComboBoxes() As ComboBox
  ReDim mComboBoxes(14)
としてインスタンスを生成して下さい。

ここのサイトの[はじめにお読み下さい]の
[サンプルご利用上の注意事項]8にありますが、
サンプルコードがある場合、そのサンプルを
単独でそのままで動作確認をして下さい。
サンプルコードに問題があるような発言を
されては失礼です。

[ツリー表示へ]
タイトルRe^2: 度々すみません
記事No1351
投稿日: 2005/01/27(Thu) 12:12
投稿者さち
るしぇさん、ありがとうございます。
おかげさまで期待していた結果を得ることが出来ました。
教えて頂いたページを閲覧する過程でいろいろ勉強にもなりました。
ほんとにありがとうございました。

[ツリー表示へ]
タイトルRe^2: xmlファイル作成
記事No1325
投稿日: 2005/01/21(Fri) 16:35
投稿者さち
akiさんそんな方法もあったんですね。
勉強になりました。ありがとうございます。
僕は最悪15個同じコードを並べようと思ってました(^_^;)
いただいたコードに関して画面のデザインもまだ途中なので
おそらくまだコントロールは増えていくと思います。
いろいろ検討してみたいと思います。
ホントにありがとうございました。

[ツリー表示へ]
タイトルRe^3: xmlファイル作成
記事No1327
投稿日: 2005/01/21(Fri) 16:40
投稿者aki
[OSのVer]:Windows    [VBのVer]:VB.NET  

> 僕は最悪15個同じコードを並べようと思ってました(^_^;)

それが一番無難で正しいと思います。
頑張ってください。

[ツリー表示へ]
タイトルRe^3: xmlファイル作成
記事No1335
投稿日: 2005/01/25(Tue) 03:25
投稿者たくボン
解決済みかもしれませんが(笑)
今回のような複数のコントロール群を一括してオブジェクトとして扱うような場合は、UserControlを使
うのが一番エレガントにできますね。
せっかく.NETを使われていることですし、オブジェクト指向的な開発をすれば良いかと思います。

@プロジェクトにUserControlを追加。
AデザイナでComboBox,TextBoxを配置。
B必要なプロパティを公開。(こんな感じでね)

Public ReadOnly Property Items() As ComboBox.ObjectCollection
  Get
    Return ComboBox1.Items
  End Get
End Property

Public Overrides Property Text() As String
  Get
    Return TextBox1.Text
  End Get
  Set(ByVal Value As String)
    TextBox1.Text = Value
  End Set
End Property

Cビルドしてフォームに作成したUserControlを15個ペタペタ貼り付け。
D呼び出し元ではこんな感じにコーディング

For Each c As Control In Me.Controls
  If TypeOf c Is UserControl1 Then
    Dim uc As UserControl1 = DirectCast(c, UserControl1)
    '必要な処理
  End If
Next

これならComboBoxとTextBoxが対になりますね。また呼び出し元でもUserControl型を指定しているので
他のコントロールと区別できますね(^-^)

もっと欲を出せば、XmlAttribute変換の動作をUserControlに持たせるのがオブジェクト指向的にはスマ
ートなやりかたですね。
XmlWriterを使うのではなく、XmlNodeを使ったコーディングにすればさらに柔軟かつ綺麗なプログラム
になりますよ。

Public Function GetAttribute(ByVal doc As Xml.XmlDocument) As Xml.XmlAttribute
  Dim attr As Xml.XmlAttribute = doc.CreateAttribute("hogehoge")
  '必要な処理
  Return attr
End Function

UserControlやXMLDocumentを使ったプログラミングは初心者にはちょっとだけ難しいかもしれません
が、理解してしまえばもっと開発が楽しくなりますよ(^-^)v
久しぶりに仕事の息抜きでVBを書いたけど、なんか微妙に新鮮ですねぇ(笑)

[ツリー表示へ]
タイトルRe^4: xmlファイル作成
記事No1336
投稿日: 2005/01/25(Tue) 08:04
投稿者さち。
たくボンさんありがとうございます。
UserControlのことまったく知りませんでした。
過去の記事などを参考にまだ決めかねてたところでしたが・・・
私にはどれも難しいものばかりで たくボンさんに教えていただいた
ものに関しても勉強してみたいと思います
貴重なご意見ありがとうございました。

[ツリー表示へ]