2016-02-19 76 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內將信息保存到數據庫的提示? –