从xml加载对象,在动态UI中编辑值,然后保存回xml [英] Load object from xml, edit values in a dynamic UI and save back to xml

查看:47
本文介绍了从xml加载对象,在动态UI中编辑值,然后保存回xml的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是阅读并将其应用于容器面板上的动态对象,标题标签,内容文本框.但是在这里,当我在文本框中填写数据时,无法保存它.

这是我反序列化的xml代码:

  string Location = Path.Combine("D:\\ Data \\ Code.xml");XmlDocument doc =新的XmlDocument();doc.Load(lokasiString);foreach(doc.DocumentElement中的XmlNode节点){字符串名称= node.Attributes [0] .InnerXml;字符串值= node.InnerText;//创建面板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;标签l =新Label();l.Text =名称;l.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 =值;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 =名称">点击击碎</string>< string name ="mode"> Slow</string>< string name =分数"> 12345</string></resources> 

我不了解使用C#解析Xml的知识.

解决方案

定义模型类并使用数据绑定来编辑模型,然后可以将问题分解为以下几部分:

  1. 定义一个包含 List< Resource> 以及每个具有 Title Content Resource 的Model类>.

  2. 编写一些逻辑以从xml加载模型或将模型保存到xml.

  3. 编写一段代码来排列UI和设置UI控件,以将数据绑定到您的模式.

然后,您可以轻松地从xml加载数据,在UI中进行编辑以及将数据保存到xml.

模型类

您可以对此类进行建模:

 公共类模型{公共列表<资源>资源{get;放;}}公共类资源{公共字符串Title {get;放;}公共字符串Content {get;放;}} 

设置用户界面

有多种方法可以动态地

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资源.资源){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(新Binding(nameof(TextBox.Text),资源,nameof(Resource.Content))));txt.Dock = DockStyle.Fill;tlp.Controls.AddRange(new Control [] {lbl,txt});}tlp.ResumeLayout();this.Controls.Add(tlp); 

加载并保存模型

您可以创建一个这样的类:

 公共类ModelFactory{公共模型FromXmlString(字符串xml){返回新的Model(){资源= XElement.Parse(xml).Elements().Select(x => ResourceFromXElement(x)).ToList()};}公共字符串ToXmlString(模型模型){返回新的XElement("resources",model.Resources.Select(x => ResourceToXElement(x)).ToArray()).ToString();}私有资源ResourceFromXElement(XElement元素){返回新的Resource(){标题= element.Attribute(名称").Value,内容= element.Value};}私有XElement ResourceToXElement(资源){返回新的XElement("string"),新的XAttribute("name",resource.Title),resource.Content);}} 

然后轻松地加载和保存模型:

 模型模型;ModelFactory modelFactory =新的ModelFactory();私有void loadButton_Click(对象发送者,EventArgs e){var xml = @"<资源>< string name =名称"" Tap Crush</string>< string name =模式"" Slow</string>< string name =分数"" 12345</string></resources>";//从xml加载模型模型= modelFactory.FromXmlString(xml);//设置界面}私人无效saveButton_Click(对象发送者,EventArgs e){//将模型保存到xmlvar xml = modelFactory.ToXmlString(model);MessageBox.Show(xml);} 

I just read and applied it to the dynamic object on the panel for the container, the label for the title, the textbox for the contents. but here I can't save it when I fill in the data in the textbox.

this is my deserialize xml code:

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);
}

and this my Xml Code:

<resources>
    <string name="name">Tap Crush</string>
    <string name="mode">Slow</string>
    <string name="score">12345</string>
</resources>

I have no prior knowledge of parsing Xml with C#.

解决方案

Define model classes and use databinding to edit the model, then you can break the problem to the following pieces:

  1. Defining a Model class containing a List<Resource> and each Resource having Title and Content.

  2. Write some logic to load model from xml or save model to xml.

  3. Write a piece of code to arrange UI and setup UI controls to use databinding to your mode.

Then you can easily Load data from xml, edit in the UI and Save data to xml.

Model classes

You can model classes like this:

public class Model
{
    public List<Resource> Resources { get; set; }
}
public class Resource
{
    public string Title { get; set; }
    public string Content { get; set; }
}

Setting up UI

There are different approaches to dynamically show a collection of controls in a form. Here I'll show how you can do that using a DataGridView as well as a TableLayoutPanel:

DataGridView

TableLayoutPanel

Create 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);

Create 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);

Load and Save Model

You can create a class like this:

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);
    }
}

Then easily load and save model:

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);
}  

这篇关于从xml加载对象,在动态UI中编辑值,然后保存回xml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆