Есть XML, который имеет простую структуру:
<Employee>
<people>
<Name>Василий</Name>
<LastName>Петрович</LastName>
</people>
</Employee>
И так далее с десяток записей.
Есть форма WPF на которую помещён ListBox
. В ListBox
при загрузке формы помещаются имена сотрудников, взятые из <Name>
. Как можно реализовать задачу, что если в ListBox
нажимают на имя, то, скажем в соседний Label
будет выводится его фамилия?
//Загрузка элементов Name и помещение их в ListBox
XElement xElements = XElement.Load(@"Employee.xml");
foreach (XElement xEle in xElements.Descendants("Name"))
{
Listbox_Employee.Items.Add((string)xEle);
}
Да данный момент, у меня эта задача работает ровно на половину. То есть, если я запушу программу, добавлю новых пользователей, а потом в ListBox
выберу новое имя, то его фамилия будет показана. Но, она будет показана ровно до перезапуска программы, потому что значения хранятся в оперативке во время выполнения. Соответственно, если после запуска программы, я добавлю новые имена, то после клика на них фамилии будут показаны, но если я кликну на имена, которые были добавлены в прошлый раз, то ничего происходить не будет.
Я понимаю, что теоретически, после щелчка на объект ListBox
, должен выполнится метод, который откроет XML, выполнит метод Container.Descendant
s и соотнесёт, что именно к этому объекту ListBox
относится именно эта фамилия.
Спасибо за помощь, Любитель.
Кстати, я работаю с помощью XElement.
Дополнение 1:
Решая задачу по рекомендации Bulson, я наткрулся на другую проблему. Я создал ещё более простую по структуре XML'ку:
<MainData>
<Name>Василий</Name>
<LastName>Петрович</LastName>
</MainData>
Создал простую форму WPF с TextBox и ListBox. Далее по рекомендациям создал отдельный класс:
[Serializable, XmlRoot("MainData")]
public class DataExctract
{
[XmlAttribute("LastName")]
public string LastName { get; set; }
}
Далее, на форме:
public MainWindow()
{
InitializeComponent();
LoadXml(); //Выполняем метод при загрузке окна
}
//Этот метод загружает XML и помещает дочерний элемент Name в ListBox
public void LoadXml()
{
try
{
XElement xElements = XElement.Load(@"DataXML.xml");
foreach (XElement xEle in xElements.Descendants("Name"))
{
listBox.Items.Add((string)xEle);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//При двойном щелчке по любому элементу помещаем фамилию в TextBox
private void listBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
try
{
StreamReader reader = new StreamReader(@"DataXML.xml");
XmlSerializer serializer = new XmlSerializer(typeof(List<DataExctract>));
DataExctract DE = (DataExctract)serializer.Deserialize(reader);
textBox.Text = DE.LastName;
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
В итоге получаю исключение:
There is an error in XML document (1, 2)
Такая ошибка появляется тогда, когда я дважды щёлкаю мышкой по имени. Я нашёл 2 подобных вопроса в англоязычном Stack, но не могу понять корень зла (не хватает знаний английского).
Person
со свойствами для ФИО.Repository
с методами для записи/чтения xml файла.List<Person> People
и присвоить его в качестве ListBox.ItemsSource
.public Person SelectedPerson { get; set; }
и сделать привязку этого свойства к ListBox.SelectedItem
, тогда при выборе в списке у вас будет изменятся это свойство и из него можно будет извлечь фамилию и показать на Label
.
Это описание в общих чертах, еще много разных ньюансов.Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Не могу найти никакой документации по вопросу, о том, что означают различные значки и пиктограммы в VS2015Пользуясь отладчиком столкнулся с непонятными...
На входе есть строка, которую необходимо преобразовать в объектДелаю так
Имеется приложение WPF, служит для дозирования жидкостейПри каждом новом дозировании необходимо проверить, сменилась ли емкость под дозатором,...