如何保存动态创建的对象

时间:2016-02-19 23:52:04

标签: c# .net vb.net

我正在寻找一种解决方案来保存动态创建的图片框及其设置。我不太清楚我会怎么做。当表单加载时,这些图片框也需要加载回程序。

也许他们可以保存到数据库中,我们怎么做?

创建图片框的代码

    PictureBox picturebox1 = new PictureBox();
    picturebox1.Name = "picturebox1";
    picturebox1.Size = new Size(48, 48);
    picturebox1.BackgroundImage = Properties.Resources.FolderIcon;
    myFlowLayoutPanel1.Controls.Add(picturebox1);

任何想法都非常受欢迎。谢谢。

2 个答案:

答案 0 :(得分:1)

串联一小部分控件并不困难。如果项目已有数据库,我可以改用它。

第一个问题是无法直接序列化控件。您需要一个类来保存重新创建它们所需的数据:

<Serializable>
Friend Class CtlItem
    Public Property Location As Point
    Public Property Size As Size
    Public Property BackColor As Color
    Public Property Text As String

    ' some serializers require a simple ctor
    Public Sub New()

    End Sub
    ' create object from passed PB
    Public Sub New(pb As Button)
        Location = pb.Location
        Size = pb.Size
        BackColor = pb.BackColor
        Text = pb.Text
    End Sub
End Class

我使用按钮代替图片盒,但概念是一样的。许多序列化程序需要<Serializable>属性和简单的ctor。我没有在代码中设置所有道具,而是让课程收获了我需要保存的道具。您需要对此进行扩展以保存控件的所有非默认属性。

获取数据,序列化和测试往返:

' collection for many control descriptors
Dim btns As New List(Of CtlItem)

' collect the data for some controls
For Each btn In TabPage1.Controls.OfType(Of Button)()
    btns.Add(New CtlItem(btn))
Next
' serialize the list 
Using fs As New FileStream("C:\Temp\Buttons.bin", FileMode.OpenOrCreate)
    fs.Position = 0
    Dim bf As New BinaryFormatter
    bf.Serialize(fs, btns)
End Using

' round trip test
Dim newBtns As List(Of CtlItem)
Using fs As New FileStream("C:\Temp\Buttons.bin", FileMode.Open)
    Dim bf As New BinaryFormatter
    newBtns = CType(bf.Deserialize(fs), List(Of CtlItem))
End Using

这使用BinaryFormatter进行序列化,但XMLSerialzer,Protobuf-Net和json的工作方式基本相同。初始集合有19个按钮,第一个是“文件”。图像显示newBtns colelction具有相同的数字,并且至少第一个匹配(序列化通常是全有或全无的命题)。 btns集合,之前:

enter image description here

newBtns集合,之后: enter image description here

然后,您的代码将从该数据重新创建控件并将其添加到表单中。如果它们来自不同的Control集合,当然还原图像,则可能会变得复杂。核心代码可以在CtlItem类中:

Friend Function NewButton() As Button
    Dim btn As New Button
    btn.Location = Location
    btn.Text = Text
    btn.BackColor = BackColor
    '...
    Return btn
End Function

答案 1 :(得分:0)

如果图像不是太大(或不是自定义),我建议保存在数据库中。 您的表看起来像这样(在M​​S-SQL管理控制台中运行脚本):

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<input type="range" min="0" max="100" value="50" step="1" id="slider" style="width:500;">
<br>
<img src="http://weknowmemes.com/generator/uploads/generated/g1369409960206058073.jpg">

(当然,您需要添加SQL CRUD代码。)

希望这足以让你开始。

好的,我将添加基本的T-SQL插入代码,但请阅读以下内容: http://www.dreamincode.net/forums/topic/103960-save-and-retrieve-images-with-sql-server/