BEBE2011 Ответов: 3

Написание текстовое поле, поле со списком, значения numericupdown как в xml в winform


Привет,
В данный момент я записываю значения textboxs, comboboxs и numericupdowns в xml-файл, подобный этому;

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = "\t";
XmlWriter xmlWriter = XmlWriter.Create(PATH, settings);
//Write to XML File

XmlWriter xmlWriter = XmlWriter.Create(PATH);

xmlWriter.WriteStartElement("NumberOfPeople");
xmlWriter.WriteString(numericUpDown7.Text);
xmlWriter.WriteEndElement();
...

Я думаю, что это не очень хороший способ сделать это, так как код может быстро стать трудным для поддержания. Можно ли использовать foreach, чтобы пройти через все элементы управления в форме, получить метки и значения элементов управления и записать их в xml-файл?Что-то вроде этого.



Что я уже пробовал:

foreach(Control c  in this.Controls)
        {
            xmlWriter.WriteStartElement(Control.Label);
            xmlWriter.WriteString(Control.Text);
            xmlWriter.WriteEndElement();
        }


Правка 1: (из решения 2)
Добавление правок, потому что я не могу добавить кодовые снипеты в комментариях ниже.
Он не улавливает никаких элементов управления? Все, что есть в XML-файле, это;

<?xml version="1.0"?>
<ArrayOfLabelValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />


Правка 2: (из решений 1 и 2)
мне удалось получить текстовые блоки vlaues, numericUpdowns,comboboxs, обратившись к панели tableLayoutPanel, в которой они отображаются . Добавив его в Foreach()
foreach (Control c in this.mytlp.Controls)

Karthik_Mahalingam

приложение для windows ?

BEBE2011

Да, Форма Windows.

Karthik_Mahalingam

сколько здесь элементов управления ?
есть ли у каждого элемента управления метка ?
каковы все уникальные элементы управления, скажем textbox, datepicker, combo и т. д.

BEBE2011

Там может быть до 50 элементов управления, которые могут быть текстовым полем, combobox или numericUpDown каждый со своей собственной меткой.

Karthik_Mahalingam

какое соглашение об именовании используется для элементов управления?

BEBE2011

txtNameofControl,lblNameOfControl,numNameofControl, cmbNameOfControl. Таким образом, NumberOfPeople будет Label = lblNumberOfPeople, а NumericUpDown будет numNumberOfPeople и так далее.

Karthik_Mahalingam

ладно, круто.
Всегда использовать  Ответить   кнопка для отправки комментариев / запросов заинтересованному пользователю, иначе пользователь не получит уведомления.

BEBE2011

Ах, моя беда! - Извините :)

Karthik_Mahalingam

проверьте мое решение.

3 Ответов

Рейтинг:
1

Member 12599256

Только для образца:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace WindowsFormsApplication5
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      var controlsInfo = new List<ControlInfo>();
      foreach (Control control in Controls)
      {
        if (control is TextBox || control is ComboBox)
        {
          var controlInfo = new ControlInfo
          {
            ControlType = control.GetType().ToString(),
            ControlLabel = control.Name,
            ControlValue = control.Text
          };
          controlsInfo.Add(controlInfo);
        }
        else if (control is NumericUpDown)
        {
          var numericUpDown = control as NumericUpDown;
          var controlInfo = new ControlInfo
          {
            ControlType = control.GetType().ToString(),
            ControlLabel = control.Name,
            ControlValue = numericUpDown.Value.ToString(CultureInfo.InvariantCulture)
          };
          controlsInfo.Add(controlInfo);
        }
      }

      var xmlSerializer = new XmlSerializer(typeof (List<ControlInfo>));
      using (var fileStream = new FileStream(@"d:\controls.xml", FileMode.Create))
      {
        xmlSerializer.Serialize(fileStream, controlsInfo);
      }
    }
  }

  [Serializable]
  public class ControlInfo
  {
    public string ControlType { get; set; }
    public string ControlLabel { get; set; }
    public string ControlValue { get; set; }
  }
}


BEBE2011

Привет, спасибо, не могли бы вы объяснить, что делает ваш код?

BEBE2011

is принимает только значение numericupDown в menustrip. он не получает другие значения, которые находятся в отдельной tablelayoutpanel.

[no name]

Это был всего лишь образец. Этот код собирает всю информацию из элементов управления и добавляет ее в список "controlinfo". Затем в конце список будет сериализован в XML-файл. Ваш заголовок был " ... textboxs, comboboxs и numericupdowns...", если вам нужно больше, чем расширить код самостоятельно. Потому что в элементах управления вы можете найти не только этот элемент управления 3, но и tablelayoutpanel ...

BEBE2011

О, так что элемент управления tablelayoutpanel , называется тоже собой контроль , я не знаю, что жаль. все textBoxs, comboxs и numericUpDowns находятся в tableLayoutPanel

Рейтинг:
1

Karthik_Mahalingam

используйте этот образец и настройте его, если есть какие-либо изменения в форме


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace WindowsFormsApplication1
{
    public class LabelValue
    {
        public string Label { get; set; }
        public string Value { get; set; }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Dictionary<string, string> dictLabelValues = new Dictionary<string, string>();
            foreach (Control c in this.Controls)
            {
                Type controlType = c.GetType();
                if (controlType == typeof(Label) || controlType == typeof(TextBox) || controlType == typeof(TextBox))
                    dictLabelValues.Add(c.Name, c.Text);
                else if (controlType == typeof(NumericUpDown))
                    dictLabelValues.Add(c.Name, (c as NumericUpDown).Value.ToString());

            }
            List<string> lstNames = dictLabelValues.Where(k => k.Key.StartsWith("lbl")).Select(k => k.Key.Substring(3)).ToList();
            List<LabelValue> list = new List<LabelValue>();
            foreach (string name in lstNames)
            {
                string label = dictLabelValues.Single(k => k.Key == "lbl" + name).Value;
                string value = dictLabelValues.FirstOrDefault(k => k.Key == "txt" + name || k.Key == "cmb" + name || k.Key == "num" + name).Value;
                // use the lable and values to write in the xml.
                list.Add(new LabelValue() { Label = label, Value = value });

            }

            string xmlPath = "sample.xml";
            var serialiser = new XmlSerializer(typeof(List<LabelValue>));
            using (var fileStream = new FileStream(xmlPath, FileMode.Create))
            {
                serialiser.Serialize(fileStream, list);
            }
        }
    }
}


BEBE2011

Спасибо, как я могу печатать в xml с помощью вашего кода?

Karthik_Mahalingam

проверьте обновленное решение.

Karthik_Mahalingam

Проверьте количество списков

BEBE2011

Отредактировал свой вопрос из-за того, что не смог разместить фрагменты кода в комментариях.

Karthik_Mahalingam

Есть ли элементы управления внутри панели.?

BEBE2011

элементы управления находятся внутри нескольких различных панелей tableLayoutPanels.

Karthik_Mahalingam

О Тогда сначала вы должны получить все элементы управления внутри панелей

BEBE2011

Да

BEBE2011

Так в командлет foreach = по каждому элементу(c контроль в этом.myTlp.Контроль))

BEBE2011

как я мог бы сделать это для нескольких tableLayoutPanels

Karthik_Mahalingam

Сколько там панелей

BEBE2011

6 tableLayoutPanels как бы вы разделили их в xml-файле?

Karthik_Mahalingam

В xml вы должны сбросить все элементы управления

BEBE2011

Да.Но как я узнаю, из какой tableLayoutPanel он взят?

Karthik_Mahalingam

Делайте шаг за шагом
Сначала попробуйте получить все элементы управления, а затем добавить их в xml по группам

BEBE2011

что я сделал, так это создал 6 циклов foreach ().??

BEBE2011

Да, вот так

Karthik_Mahalingam

foreach (панель управления в этом.Управления.OfType<TableLayoutPanel>())
{
foreach (Control c in panel.Управления)
{
Относящиеся к типу тип = гр.Метод gettype();
если (относящиеся к типу == typeof на(этикетка) || относящиеся к типу == typeof на(текстовое поле) || относящиеся к типу == typeof на(текстовое поле))
dictLabelValues.Добавления(возр.Наименование, Си.Текст);
остальное, если (относящиеся к типу == typeof на(numericupdown как))
dictLabelValues.Добавить(c.Name, (c как NumericUpDown).Ценность.Метод toString());
}

}

Рейтинг:
1

Sergey Alexandrovich Kryukov

Просто пара идей:

  • Крайне важно отделить модель данных пользовательского интерфейса от самого пользовательского интерфейса. Лучше даже не играйте с идеей делать что-либо так, как описано в решении 1 или 2.

    Вы должны создать модель данных, абстрагированную от реализации пользовательского интерфейса. Рабочий процесс должен абстрагироваться от двух шагов: заполнения экземпляра модели из состояния пользовательского интерфейса и заполнения пользовательского интерфейса из экземпляра модели.
  • Даже не пытайтесь использовать XML напрямую (если только вы не хотите разработать собственную технологию сериализации). Просто не надо. Вместо этого используйте сериализация, но не устаревшая и страшная сериализация .NET XML (основанная на ISerializable и так далее). Вместо этого используйте контракт данных подход, который является наиболее надежным и простым в использовании; в отличие от других подходов, он полностью типо-агностический, ненавязчивый и универсальный. Вы просто сохраните любой граф объекта в любом потоке и позже восстановить его в памяти.

    Пожалуйста, смотрите: Использование Контрактов Данных.

—СА


BEBE2011

Привет, не могли бы вы привести мне пример кода того, что вы имеете в виду.Используя мой сценарий, просто что-то, чтобы начать с использования вашего возможного решения.

Sergey Alexandrovich Kryukov

Ссылка, которую я привел, приведет вас к примерам. Это очень простая вещь в использовании.
Если у вас есть какие-то проблемы, напишите код самостоятельно и задавайте вопросы, если у вас возникнут какие-либо проблемы. Слишком рано просить образцы, когда вы ничего не пробовали. Начните с документации; это самый быстрый способ.

Если ничего не получится, я с радостью постараюсь помочь.

—СА