2016-02-19 74 views
0

我正在寻找一种解决方案来保存我的动态创建的图片框及其设置。我不太确定我会如何去做这件事。此外,这些图片框需要在窗体加载时重新加载到程序中。如何保存动态创建的对象

也许他们可以保存到数据库中,我们将如何做到这一点?

代码来创建图片框

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

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

+1

你熟悉[连载](https://msdn.microsoft.com/en-us/library/ms973893.aspx?f=255&MSPPError=-2147217396 )? –

+0

你为什么动态创建图片框? –

+0

不幸的是,我不是。我现在会看看。 –

回答

1

Serialing控件的小集合并不困难。如果项目已有数据库,则可以使用该数据库。

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

<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 

我使用按钮代替pictureboxes的,但概念是相同的。许多序列化器需要<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网和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 
+0

谢谢,我会进一步看看。似乎它会起作用。我会做一些测试,并试着回到你身边。感谢您的帮助。 –

+1

你好,再次设法让一切正常工作。感谢你的工作。 –

0

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

CREATE TABLE dbo.picturebox  (
    pbID int NOT NULL, 
    pbName nvarchar(50) NOT NULL, 
    pbSize1 float(53) NULL, 
    pbSize2 float(53) NULL, 
    pbBackGroundImage image NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
ALTER TABLE dbo.picturebox SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT 

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

希望这就够了让你开始。

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

+0

只要看看序列化选项,但我一定会尝试这一点。感谢或回应。 –

+0

不用担心!这完全取决于预期的用途。如果图像不是自定义图像且安全(不需要保存),那么最好不要将它们存储在数据库中。 – DaniDev

+0

真的很喜欢这个选项,看起来像在背后去上班的痛苦。老实说,我对编程颇为陌生,这非常棘手。我会给它一个如何,如何从vb内将信息保存到数据库的提示? –