winform如何保存動態生成的控制元件的位置到檔案
uj5u.com熱心網友回復:
https://bbs.csdn.net/topics/396830133取屬性也行,取基本(坐標、內容什么的)也行,建個類,序列化到檔案,可以讀取
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Windows.Forms;
namespace Demo_1
{
// “參考”里面添加 System.Runtime.Serialization
public partial class Form1 : Form
{
[DataContract]
public class Record
{
[DataMember]
public string Obj_Type; // 型別
[DataMember]
public Point Obj_Point; // 位置
[DataMember]
public Size Obj_Size; // 大小
[DataMember]
public string Obj_BackColor; // 顏色
[DataMember]
public string Obj_Content; // 內容
public Record(string t, Point p, Size s, string c, string e)
{
Obj_Type = t;
Obj_Point = p;
Obj_Size = s;
Obj_BackColor = c;
Obj_Content = e;
}
}
public static List<Record> Obj_Record = new List<Record>();
public Form1()
{
InitializeComponent();
for (int i = 0; i < 3; i++)
{
Label label = new Label()
{
Location = new Point(10+i*130, 10),
Size = new Size(100, 20),
Text = "CSDN-12345",
BackColor = Color.WhiteSmoke
};
this.Controls.Add(label);
Obj_Record.Add(new Record(label.GetType().ToString(), label.Location, label.Size, ColorTranslator.ToHtml(label.BackColor), label.Text));
PictureBox picture = new PictureBox()
{
Location = new Point(10+i*130, 40),
Size = new Size(20, 20),
Image = Bitmap.FromFile("pimg.png"),
BackColor = Color.WhiteSmoke,
};
this.Controls.Add(picture);
Obj_Record.Add(new Record(picture.GetType().ToString(), picture.Location, picture.Size, ColorTranslator.ToHtml(label.BackColor), BitmapToBase64String(picture.Image as Bitmap)));
}
string Serialization_Obj = ObjectToJson(Obj_Record);
Button button_view = new Button()
{
Location = new Point(10,90),
Text = "查看json",
};
button_view.Click += (s, e) => { MessageBox.Show(Serialization_Obj); }; // 序列化的字串,可以保存為檔案
this.Controls.Add(button_view);
////////////////////////////////////////////////////////////////////////
Button button_clear = new Button() // 清除組件、陣列
{
Location = new Point(110, 90),
Text = "清除組件",
};
button_clear.Click += (s, e) =>
{
Jmp:
foreach (var item in this.Controls)
{
if (!(item is Button))
{
this.Controls.Remove(item as Control);
goto Jmp;
}
}
Obj_Record.Clear();
};
this.Controls.Add(button_clear);
////////////////////////////////////////////////////////////////////////
Button button_load = new Button() // 裝入組件
{
Location = new Point(210, 90),
Text = "裝入組件",
};
button_load.Click += (s, e) =>
{
Obj_Record = JsonToObject<List<Record>>(Serialization_Obj); // 裝入字串,轉化為物件
foreach(var item in Obj_Record)
{
if (item.Obj_Type.Contains("Label"))
{
Label label = new Label()
{
Location = item.Obj_Point,
Size = item.Obj_Size,
Text = item.Obj_Content,
BackColor = ColorTranslator.FromHtml(item.Obj_BackColor),
};
this.Controls.Add(label);
}
if (item.Obj_Type.Contains("PictureBox"))
{
PictureBox picture = new PictureBox()
{
Location = item.Obj_Point,
Size = item.Obj_Size,
Image = Base64StringToImage(item.Obj_Content),
BackColor = ColorTranslator.FromHtml(item.Obj_BackColor),
};
this.Controls.Add(picture);
}
}
};
this.Controls.Add(button_load);
}
// bitmap轉base64
private string BitmapToBase64String(Bitmap bmp)
{
try
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); // Png影像
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
return Convert.ToBase64String(arr);
}
catch
{
return null;
}
}
// base64轉bitmap
public static Bitmap Base64StringToImage(string inputStr)
{
try
{
byte[] arr = Convert.FromBase64String(inputStr);
MemoryStream ms = new MemoryStream(arr);
Bitmap bmp = new Bitmap(ms);
ms.Close();
return bmp;
}
catch
{
return null;
}
}
// 序列化為json
public static string ObjectToJson<T>(T t) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.WriteObject(stream, t);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
}
// 反序列化為物件
public static T JsonToObject<T>(string json) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
T result = formatter.ReadObject(stream) as T;
return result;
}
}
}
}
uj5u.com熱心網友回復:
保存在資料庫或xml檔案都可以,關鍵是保存的內容,看看顯示控制元件的主要屬性是什么,如果location,size,text cnchor等
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285322.html
標籤:C#
上一篇:System.Data.Common.DbCommand.ExecuteNonQuery()執行merge into回傳負數
