โหลดวัตถุจาก xml แก้ไขค่าใน UI แบบไดนามิกและบันทึกกลับเป็น xml
ฉันเพิ่งอ่านและนำไปใช้กับวัตถุไดนามิกบนแผงสำหรับคอนเทนเนอร์ป้ายกำกับชื่อเรื่องกล่องข้อความสำหรับเนื้อหา แต่ที่นี่ฉันไม่สามารถบันทึกได้เมื่อกรอกข้อมูลในช่องข้อความ
นี่คือรหัส xml deserialize ของฉัน:
string Location= Path.Combine("D:\\Data\\Code.xml");
XmlDocument doc = new XmlDocument();
doc.Load(lokasiString);
foreach (XmlNode node in doc.DocumentElement)
{
string name = node.Attributes[0].InnerXml;
string value = node.InnerText;
// create panel
Panel panel = new Panel();
panel.Name = "panelImages";
panel.Size = new Size((int)(this.Width*0.9), 30);
panel.Dock = DockStyle.Top;
panel.BorderStyle = BorderStyle.FixedSingle;
Label l = new Label();
l.Text = name;
l.Font = new Font("Serif", 12, FontStyle.Bold);
l.ForeColor = Color.Black;
l.Size = new Size((int)(this.Width * 0.2), 30);
l.Dock = DockStyle.Left;
TextBox tb = new TextBox();
tb.Text = value;
tb.Font = new Font("Serif", 12, FontStyle.Bold);
tb.ForeColor = Color.Black;
tb.Size = new Size((int)(this.Width * 0.9), 30);
tb.Dock = DockStyle.Left;
panel.Controls.Add(tb);
panel.Controls.Add(lt);
panel.Controls.Add(l);
flowLayoutPanel1.Controls.Add(panel);
}
และนี่คือรหัส Xml ของฉัน:
<resources>
<string name="name">Tap Crush</string>
<string name="mode">Slow</string>
<string name="score">12345</string>
</resources>
ฉันไม่มีความรู้มาก่อนเกี่ยวกับการแยกวิเคราะห์ Xml ด้วย C #
คำตอบ
กำหนดคลาสโมเดลและใช้ databinding เพื่อแก้ไขโมเดลจากนั้นคุณสามารถแบ่งปัญหาออกเป็นส่วนต่อไปนี้:
การกำหนดระดับรุ่นที่มี
List<Resource>
และแต่ละคนResource
มีและTitle
Content
เขียนตรรกะเพื่อโหลดโมเดลจาก xml หรือบันทึกโมเดลเป็น xml
เขียนโค้ดเพื่อจัดเรียง UI และตั้งค่าตัวควบคุม UI เพื่อใช้ databinding ในโหมดของคุณ
จากนั้นคุณสามารถโหลดข้อมูลจาก xml แก้ไขใน UI และบันทึกข้อมูลเป็น xml ได้อย่างง่ายดาย
คลาสโมเดล
คุณสามารถจำลองชั้นเรียนได้ดังนี้:
public class Model
{
public List<Resource> Resources { get; set; }
}
public class Resource
{
public string Title { get; set; }
public string Content { get; set; }
}
การตั้งค่า UI
มีวิธีการที่แตกต่างกันในการแสดงคอลเล็กชันการควบคุมแบบไดนามิกในฟอร์ม ที่นี่ฉันจะแสดงวิธีที่คุณสามารถทำได้โดยใช้ DataGridView และ TableLayoutPanel:
DataGridView
TableLayoutPanel
สร้าง DataGridView
var dg = new DataGridView();
dg.Dock = DockStyle.Fill;
dg.BorderStyle = BorderStyle.None;
dg.GridColor = Color.Black;
dg.AutoGenerateColumns = true;
dg.EditMode = DataGridViewEditMode.EditOnEnter;
dg.DataSource = model.Resources;
dg.DataBindingComplete += (o, a) =>
{
dg.RowHeadersVisible = dg.ColumnHeadersVisible = false;
dg.AllowUserToResizeColumns = false;
dg.AllowUserToResizeRows = false;
dg.BackgroundColor = SystemColors.Control;
dg.Columns[0].ReadOnly = true;
dg.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dg.Columns[0].DefaultCellStyle.ForeColor = Color.Black;
dg.Columns[0].DefaultCellStyle.BackColor = SystemColors.Control;
dg.Columns[0].DefaultCellStyle.SelectionForeColor = Color.Black;
dg.Columns[0].DefaultCellStyle.SelectionBackColor = SystemColors.Control;
dg.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
};
this.Controls.Add(dg);
สร้าง TableLayoutPanel
var tlp = new TableLayoutPanel() { ColumnCount = 2, AutoSize = true };
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
tlp.SuspendLayout();
foreach (var resource in model.Resources)
{
tlp.RowStyles.Add(new RowStyle(SizeType.AutoSize));
var lbl = new Label() { AutoSize = true, Margin = new Padding(4) };
lbl.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
lbl.DataBindings.Add(new Binding(nameof(Label.Text), resource, nameof(Resource.Title)));
var txt = new TextBox();
txt.DataBindings.Add(new Binding(nameof(TextBox.Text), resource, nameof(Resource.Content)));
txt.Dock = DockStyle.Fill;
tlp.Controls.AddRange(new Control[] { lbl, txt });
}
tlp.ResumeLayout();
this.Controls.Add(tlp);
โหลดและบันทึกโมเดล
คุณสามารถสร้างคลาสดังนี้:
public class ModelFactory
{
public Model FromXmlString(string xml)
{
return new Model()
{
Resources = XElement.Parse(xml).Elements()
.Select(x => ResourceFromXElement(x)).ToList()
};
}
public string ToXmlString(Model model)
{
return new XElement("resources",
model.Resources.Select(x => ResourceToXElement(x)).ToArray())
.ToString();
}
private Resource ResourceFromXElement(XElement element)
{
return new Resource()
{
Title = element.Attribute("name").Value,
Content = element.Value
};
}
private XElement ResourceToXElement(Resource resource)
{
return new XElement("string",
new XAttribute("name", resource.Title),
resource.Content);
}
}
จากนั้นโหลดและบันทึกโมเดลได้อย่างง่ายดาย:
Model model;
ModelFactory modelFactory = new ModelFactory();
private void loadButton_Click(object sender, EventArgs e)
{
var xml = @"
<resources>
<string name=""name"">Tap Crush</string>
<string name=""mode"">Slow</string>
<string name=""score"">12345</string>
</resources>";
//Load model from xml
model = modelFactory.FromXmlString(xml);
//Setup UI
}
private void saveButton_Click(object sender, EventArgs e)
{
//Save model to xml
var xml = modelFactory.ToXmlString(model);
MessageBox.Show(xml);
}