ऑब्जेक्ट को xml से लोड करें, डायनेमिक UI में मान संपादित करें और वापस xml में सहेजें

Jan 12 2021

मैंने अभी कंटेनर के लिए पैनल पर डायनामिक ऑब्जेक्ट पर पढ़ा और लगाया, शीर्षक के लिए लेबल, सामग्री के लिए टेक्स्टबॉक्स। लेकिन जब मैं टेक्स्टबॉक्स में डेटा भरता हूं तो मैं इसे सहेज नहीं सकता।

यह मेरा deserialize xml कोड है:

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>

मुझे C # के साथ Xml पार्स करने का कोई पूर्व ज्ञान नहीं है।

जवाब

2 RezaAghaei Jan 12 2021 at 03:11

मॉडल कक्षाओं को परिभाषित करें और मॉडल को संपादित करने के लिए डेटाबाइंडिंग का उपयोग करें, तो आप समस्या को निम्नलिखित टुकड़ों में तोड़ सकते हैं:

  1. एक से युक्त एक मॉडल वर्ग को परिभाषित करना List<Resource>और प्रत्येक Resourceहोने Titleऔर Content

  2. मॉडल को xml से लोड करने के लिए कुछ तर्क लिखें या मॉडल को xml में सहेजें।

  3. UI और सेटअप UI नियंत्रणों को व्यवस्थित करने के लिए अपने मोड में डेटाबाइंडिंग का उपयोग करने के लिए कोड का एक टुकड़ा लिखें।

फिर आप आसानी से 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; }
}

यूआई स्थापित करना

गतिशील रूप से नियंत्रण का एक संग्रह दिखाने के लिए अलग-अलग दृष्टिकोण हैं । यहाँ मैं दिखाऊँगा कि आप कैसे एक DataGridView के साथ-साथ TableLayoutPanel का उपयोग कर सकते हैं:

DataGridView

टेबल लाइटलोपनेल

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