0

パネル上の各オブジェクトをシリアル化し、それをいくつかのプロパティを含む .dat ファイルに入れることができました (考えられるすべてのプロパティについては後日行います)。このファイルは次のようになります。

<DocumentElement>
 <Controls>
   <Name>Label2</Name>
   <Text>hyvgiyb</Text>
   <Width>74</Width>
   <Height>21</Height>
   <Top>173</Top>
   <Left>269</Left>
 </Controls>
 <Controls>
   <Name>Label1</Name>
   <Text>Picture</Text>
   <Width>74</Width>
   <Height>21</Height>
   <Top>114</Top>
   <Left>240</Left>
 </Controls>
</DocumentElement

これは、ほんの数個のプロパティを持つ 2 つのコントロールです。Xml をコントロールのプロパティに変換したいので、コントロールを追加して、次のように簡単に実行できます。

'code to add control
'control properties
 .Name = DataFromXml
 .Text = DataFromXml
 '...etc

コントロールを追加するコードについては、既に持っているので心配しないでください。各コントロールの個々のプロパティを取得する必要があるだけです(各コントロールのプロパティは の間に保持されています。これは、何らかの方法で区別する必要があります)。

明確にするために、.dat ファイルとの間で読み書きを行っており、Visual Studio 2012 で VB.NET を使用しています。

4

2 に答える 2

0

リフレクションで値を割り当てるとどうなりますか? すこし:

var control = FindByName(...);

foreach (var node in xmlNode.Children) {
    typeof(control).GetProperty(node.Name).SetValue(control, node.InnerText)
}
于 2013-10-02T17:48:00.390 に答える
0

XML ファイルを実際に読みたくない場合があります。シリアル化されたときに (list(of?), collection?) のどこにコントロールがあったとしても、XML は同じものに逆シリアル化できるため、簡単になる可能性があります。たとえば、これらのプロパティを含むクラスのコレクションをシリアル化した場合、それを取り戻すことができます。

それ以外の場合は、XML をデータテーブルに読み込むことができます (他の方法もあります)。

Dim ds As New DataSet()
Dim dt as New DataTable
' Create new FileStream with which to read the file
Dim fsReadXml As New System.IO.FileStream _
    (myXMLfile, System.IO.FileMode.Open)
Try
    ds.ReadXml(fsReadXml)

Catch ex As Exception
    MessageBox.Show(ex.ToString())
Finally
    fsReadXml.Close()
End Try
dt = ds.Tables(0)

次に、テーブルをループして、親のコントロール配列に追加する新しいコントロールにプロパティ値をフェッチします。それぞれに 1 つのdt.Rowsコントロールのデータが含まれ、列には各プロパティが保持されます。ファイルを作成したので、列名が何であるかがわかり、名前でそれらを参照できます。

For each dr as Datarow  In ds.Tables(0).Rows
    Dim lbl as New Label

    With lbl
     .Top = dr.Item("Top")
     ' etc etc etc
    End with

   ' add to parent
    pnlThing.Controls.Add(lbl)

 Next

XML ソースで遭遇することは、そこにさまざまな種類のコントロールがある場合、ctl.Type も保存する必要がありますが、名前からどの種類のコントロールであるかを解析します。

編集:バイナリシリアライザーの方が簡単です:

    For Each ctl As Control In pnl1.Controls
        Dim c As New Class1
        c.sz = ctl.Size
        c.pt = ctl.Location
        c.name = ctl.Name

        L.Add(c)
    Next

    ' Persist to file
    Dim stream As FileStream = File.Create("C:\Temp\bin.dat")
    Dim formatter As New BinaryFormatter()
    formatter.Serialize(stream, L)         ' NOTE serialize the LIST of Class1
    stream.Close()

逆シリアル化すると、「グループ」で参照できるすべての小道具、または幅と高さの代わりに SIZE のように既に知っているもののセットを含む新しいリスト (クラス 1 の) が作成されます。どうやら配列を処理しないControlsため、必要なものを収集する必要があります。

于 2013-10-02T17:48:49.410 に答える