Создание формы пользователя на основе узлов в XML - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть динамически генерируемые кнопки на одной из моих пользовательских форм.Кнопки создаются на основе узлов в XML-файле.

    namespace e2e_template
{
    public partial class Form3 : Form
    {
        public Form3(string data)
        {
            string Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();

           string Result = Username.Length <= 4 ? "" : Username.Substring(4);


            string Path = $"C:\\Users\\{Result}\\Documents\\template\\config.xml";
            //MessageBox.Show(Path);

            XmlDocument doc = new XmlDocument();
            doc.Load(Path);
            XmlNodeList templates = doc.SelectNodes("//template");


            int x = 10;
            int y = 10;


           foreach (XmlNode template in templates)
            {
                string name = template.SelectSingleNode("name").InnerText.Trim();
                Button button = new Button
                {
                    Text = name,
                    Width = 250,
                    Height = 75,
                    Left = x + 20,
                    Top = y,
                };
                button.Click += new EventHandler(Button_Click);
                Controls.Add(button);
              y += button.Height + 5;
            }
            InitializeComponent();

        }
        private void Button_Click(object sender, EventArgs e)
    {
        Form4 form = new Form4();
        form.ShowDialog();
    }
    }

}

Мне бы хотелось, чтобы при нажатии на кнопку и открытии новой пользовательской формы (в данном случае form4) я хотел бы отображать текст между другими узлами. Однако вXML-файл.Файл XML выглядит следующим образом:

<template id="Some Template ID">

      <name>Template name</name>
      <description>Discription of this template</description>
      <item id="1">1st item of this template</item>
      <item id="2">2nd item of this template</item>
      <item id="3">3rd item of this template</item>
      <item id="4">4th item of this template</item>

    </template>

Так что, если я нажму на кнопку с надписью, например, «Имя шаблона», откроется пользовательская форма4, как сейчас, но я увижу идентификатор элемента в списке 1под другим.но сложность в том, что количество идентификаторов различно.Я имею в виду, что может быть как 4, так и 10. Как мне подойти к этой проблеме?

1 Ответ

0 голосов
/ 18 февраля 2019

Прежде всего, создайте один класс,

public class Item
{
    public string Id { get; set; }
    public string Name { get; set; }
}

Создайте публичное свойство в вашей Form4 как

 public string Description { get; set; }
 public List<Item> Items { get; set; }

Затем измените ваш код, как показано ниже, чтобы получить подробную информацию о конкретном шаблонеto form4

private void Button_Click(object sender, EventArgs e)
{
    XDocument xDoc = XDocument.Load(@"Path to your xml file");

    string buttonText = (sender as Button).Text;

    string description = xDoc.Descendants("template").Where(x => x.Element("name").Value == buttonText).Select(x => x.Element("description").Value).FirstOrDefault();

    var listofItems = xDoc.Descendants("template").Where(x => x.Element("name").Value == buttonText).SelectMany(x => x.Elements("item")).Select(y => new Item { Id = y.Attribute("id").Value, Name = y.Value });

    Form4 form = new Form4();

    form.Description = description;
    form.Items = listofItems.ToList();

    form.ShowDialog();
}

А теперь у Description и Items есть значения в Form4, и вы можете использовать их по-своему.

...