Как задать картинку в DataGrid в определенном случае
Есть код, в котором выводятся некоторые данные в таблицу
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml;
namespace Students_Book_3._0
{
public partial class prepodupravPE : Window
{
public prepodupravPE()
{
InitializeComponent();
}
class MyTable
{
public MyTable(int ID, string ФИО,string Фото, string Специфик, string Группа)
{
this.ID = ID;
this.ФИО = ФИО;
this.Фото = Фото;
this.Специфик = Специфик;
this.Группа = Группа;
}
public int ID { get; set; }
public string ФИО { get; set; }
public string Фото { get; set; }
public string Специфик { get; set; }
public string Группа { get; set; }
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
List<MyTable> result = new List<MyTable>(100000);
XmlDocument doc = new XmlDocument();
doc.Load("declor/ConfigurationS.sb");
foreach (XmlNode node in doc.DocumentElement)
{
int Id1 = int.Parse(node.Attributes[0].Value);
string id = node["id"].InnerText;
string fio1 = node["fio"].InnerText;
string date1 = node["date"].InnerText;
string spec1 = node["specification1"].InnerText;
string group1 = node["group1"].InnerText;
result.Add(new MyTable(Id1, fio1, id, spec1, group1));
}
grid.ItemsSource = result;
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void grid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}
Вот так это это выглядит в XML
<Window x:Class="Students_Book_3._0.prepodupravPE"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Students_Book_3._0"
mc:Ignorable="d"
Title="prepodupravPE" Height="450" Width="800" Loaded="Window_Loaded">
<Window.Background>
<ImageBrush ImageSource="2edf92257a2dd443c7ec2f29e1df3d6e.jpg"/>
</Window.Background>
<Grid>
<Viewbox MaxHeight="2500" Margin="-10,0,10,-8">
<Canvas Width="604" Height="317">
<ComboBox Canvas.Left="10" Width="120" SelectionChanged="ComboBox_SelectionChanged"/>
<DataGrid x:Name="grid" Height="285" Canvas.Left="10" Canvas.Top="22" Width="313" Opacity="0.7" Foreground="Black" Background="Black" SelectionChanged="grid_SelectionChanged" FontSize="10"/>
<Button Content="Поиск" Canvas.Left="130" Width="75" Height="22"/>
<Button Content="Добавить" Canvas.Left="248" Width="75" Height="22"/>
</Canvas>
</Viewbox>
</Grid>
</Window>
Файл ConfigurationS.sb
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="1">
<id>1</id>
<fio>Крейзив Данила Тычоевич</fio>
<name>Данила</name>
<otch>Тычоевич</otch>
<fam>Крейзив</fam>
<date>16.10.2007</date>
<vozr>12</vozr>
<specification1>EV3</specification1>
<group1>КМ-02</group1>
<specification2>EV3</specification2>
<group2>КМ-01</group2>
<specification3>
</specification3>
<group3>
</group3>
<specification4>
</specification4>
<group4>
</group4>
<specification5>
</specification5>
<group5>
</group5>
<specification6>
</specification6>
<group6>
</group6>
<specification7>
</specification7>
<group7>
</group7>
<specification8>
</specification8>
<group8>
</group8>
<balance1>320</balance1>
<colvozanat1>0</colvozanat1>
<balance2>280</balance2>
<colvozanat2>0</colvozanat2>
<balance3>0</balance3>
<colvozanat3>0</colvozanat3>
<balance4>0</balance4>
<colvozanat4>0</colvozanat4>
<balance5>0</balance5>
<colvozanat5>0</colvozanat5>
<balance6>0</balance6>
<colvozanat6>0</colvozanat6>
<balance7>0</balance7>
<colvozanat7>0</colvozanat7>
<balance8>0</balance8>
<colvozanat8>0</colvozanat8>
<posesh1>14</posesh1>
<posesh2>0</posesh2>
<posesh3>0</posesh3>
<posesh4>0</posesh4>
<posesh5>0</posesh5>
<posesh6>0</posesh6>
<posesh7>0</posesh7>
<posesh8>0</posesh8>
<oplata1>10</oplata1>
<oplata2>15</oplata2>
<oplata3>0</oplata3>
<oplata4>0</oplata4>
<oplata5>0</oplata5>
<oplata6>0</oplata6>
<oplata7>0</oplata7>
<oplata8>0</oplata8>
<school>0</school>
<bally1>0</bally1>
<bally2>0</bally2>
<bally3>0</bally3>
<bally4>0</bally4>
<bally5>0</bally5>
<bally6>0</bally6>
<bally7>0</bally7>
<bally8>0</bally8>
<id>1</id>
<prepod>Качалов Сергей Олегович</prepod>
<regdate>29.01.2020</regdate>
<status>Активен</status>
<skidos>0</skidos>
<parent1>Маман</parent1>
<parentname1>Пох Че Тут</parentname1>
<parentphone1>88001006868</parentphone1>
<parent2>Папан</parent2>
<parentname2>Пох Че Тут</parentname2>
<parentphone2>88001007575</parentphone2>
<parent3>Бабан</parent3>
<parentname3>Пох Че Тут</parentname3>
<parentphone3>88001008383</parentphone3>
<parent4>Дедан</parent4>
<parentname4>Пох Че Тут</parentname4>
<parentphone4>88001002727</parentphone4>
<parent5>Бабан</parent5>
<parentname5>Пох Че Тут</parentname5>
<parentphone5>88001003939</parentphone5>
<parent6>Дедан</parent6>
<parentname6>Вин Ни Пух</parentname6>
<parentphone6>88001001010</parentphone6>
<lastcheng>88001001010</lastcheng>
<nachalo1>00:00:00</nachalo1>
<Konec1>00:00:00</Konec1>
<time1>00:00:00</time1>
<obshtime1>00:00:00</obshtime1>
<babkizachas1>0</babkizachas1>
<nachalo2>00:00:00</nachalo2>
<Konec2>00:00:00</Konec2>
<time2>00:00:00</time2>
<obshtime2>00:00:00</obshtime2>
<babkizachas2>0</babkizachas2>
<nachalo3>00:00:00</nachalo3>
<Konec3>00:00:00</Konec3>
<time3>00:00:00</time3>
<obshtime3>00:00:00</obshtime3>
<babkizachas3>0</babkizachas3>
<nachalo4>00:00:00</nachalo4>
<Konec4>00:00:00</Konec4>
<time4>00:00:00</time4>
<obshtime4>00:00:00</obshtime4>
<babkizachas4>0</babkizachas4>
<nachalo5>00:00:00</nachalo5>
<Konec5>00:00:00</Konec5>
<time5>00:00:00</time5>
<obshtime5>00:00:00</obshtime5>
<babkizachas5>0</babkizachas5>
<nachalo6>00:00:00</nachalo6>
<Konec6>00:00:00</Konec6>
<time6>00:00:00</time6>
<obshtime6>00:00:00</obshtime6>
<babkizachas6>0</babkizachas6>
<nachalo7>00:00:00</nachalo7>
<Konec7>00:00:00</Konec7>
<time7>00:00:00</time7>
<obshtime7>00:00:00</obshtime7>
<babkizachas7>0</babkizachas7>
<nachalo8>00:00:00</nachalo8>
<Konec8>00:00:00</Konec8>
<time8>00:00:00</time8>
<obshtime8>00:00:00</obshtime8>
<babkizachas8>0</babkizachas8>
<dolg1>10</dolg1>
<dolg2>0</dolg2>
<dolg3>0</dolg3>
<dolg4>0</dolg4>
<dolg5>0</dolg5>
<dolg6>0</dolg6>
<dolg7>0</dolg7>
<dolg8>0</dolg8>
<zapas1>30</zapas1>
<zapas2>0</zapas2>
<zapas3>0</zapas3>
<zapas4>0</zapas4>
<zapas5>0</zapas5>
<zapas6>0</zapas6>
<zapas7>0</zapas7>
<zapas8>0</zapas8>
<dat1></dat1>
<dat2></dat2>
<dat3></dat3>
<dat4></dat4>
<dat5></dat5>
<dat6></dat6>
<dat7></dat7>
<dat8></dat8>
</student>
<student id="2">
<id>2</id>
<fio>111 2222 333333</fio>
<name>111</name>
<otch>333333</otch>
<fam>2222</fam>
<date>15.10.2007</date>
<vozr>12</vozr>
<specification1>EV3</specification1>
<group1>КМ-03</group1>
<specification2>WeDo</specification2>
<group2>КВ-01</group2>
<specification3>
</specification3>
<group3>
</group3>
<specification4>
</specification4>
<group4>
</group4>
<specification5>
</specification5>
<group5>
</group5>
<specification6>
</specification6>
<group6>
</group6>
<specification7>
</specification7>
<group7>
</group7>
<specification8>
</specification8>
<group8>
</group8>
<balance1>0</balance1>
<colvozanat1>0</colvozanat1>
<balance2>0</balance2>
<colvozanat2>0</colvozanat2>
<balance3>0</balance3>
<colvozanat3>0</colvozanat3>
<balance4>0</balance4>
<colvozanat4>0</colvozanat4>
<balance5>0</balance5>
<colvozanat5>0</colvozanat5>
<balance6>0</balance6>
<colvozanat6>0</colvozanat6>
<balance7>0</balance7>
<colvozanat7>0</colvozanat7>
<balance8>0</balance8>
<colvozanat8>0</colvozanat8>
<posesh1>14</posesh1>
<posesh2>0</posesh2>
<posesh3>0</posesh3>
<posesh4>0</posesh4>
<posesh5>0</posesh5>
<posesh6>0</posesh6>
<posesh7>0</posesh7>
<posesh8>0</posesh8>
<oplata1>0</oplata1>
<oplata2>0</oplata2>
<oplata3>0</oplata3>
<oplata4>0</oplata4>
<oplata5>0</oplata5>
<oplata6>0</oplata6>
<oplata7>0</oplata7>
<oplata8>0</oplata8>
<school>0</school>
<bally1>0</bally1>
<bally2>0</bally2>
<bally3>0</bally3>
<bally4>0</bally4>
<bally5>0</bally5>
<bally6>0</bally6>
<bally7>0</bally7>
<bally8>0</bally8>
<id>2</id>
<prepod>Качалов Сергей Олегович</prepod>
<regdate>29.01.2020</regdate>
<status>Активен</status>
<skidos>0</skidos>
<parent1>Маман</parent1>
<parentname1>Пох Че Тут</parentname1>
<parentphone1>88001006868</parentphone1>
<parent2>Папан</parent2>
<parentname2>Пох Че Тут</parentname2>
<parentphone2>88001007575</parentphone2>
<parent3>Бабан</parent3>
<parentname3>Пох Че Тут</parentname3>
<parentphone3>88001008383</parentphone3>
<parent4>Дедан</parent4>
<parentname4>Пох Че Тут</parentname4>
<parentphone4>88001002727</parentphone4>
<parent5>Бабан</parent5>
<parentname5>Пох Че Тут</parentname5>
<parentphone5>88001003939</parentphone5>
<parent6>Дедан</parent6>
<parentname6>Вин Ни Пух</parentname6>
<parentphone6>88001001010</parentphone6>
<lastcheng>88001001010</lastcheng>
<nachalo1>00:00:00</nachalo1>
<Konec1>00:00:00</Konec1>
<time1>00:00:00</time1>
<obshtime1>00:00:00</obshtime1>
<babkizachas1>0</babkizachas1>
<nachalo2>00:00:00</nachalo2>
<Konec2>00:00:00</Konec2>
<time2>00:00:00</time2>
<obshtime2>00:00:00</obshtime2>
<babkizachas2>0</babkizachas2>
<nachalo3>00:00:00</nachalo3>
<Konec3>00:00:00</Konec3>
<time3>00:00:00</time3>
<obshtime3>00:00:00</obshtime3>
<babkizachas3>0</babkizachas3>
<nachalo4>00:00:00</nachalo4>
<Konec4>00:00:00</Konec4>
<time4>00:00:00</time4>
<obshtime4>00:00:00</obshtime4>
<babkizachas4>0</babkizachas4>
<nachalo5>00:00:00</nachalo5>
<Konec5>00:00:00</Konec5>
<time5>00:00:00</time5>
<obshtime5>00:00:00</obshtime5>
<babkizachas5>0</babkizachas5>
<nachalo6>00:00:00</nachalo6>
<Konec6>00:00:00</Konec6>
<time6>00:00:00</time6>
<obshtime6>00:00:00</obshtime6>
<babkizachas6>0</babkizachas6>
<nachalo7>00:00:00</nachalo7>
<Konec7>00:00:00</Konec7>
<time7>00:00:00</time7>
<obshtime7>00:00:00</obshtime7>
<babkizachas7>0</babkizachas7>
<nachalo8>00:00:00</nachalo8>
<Konec8>00:00:00</Konec8>
<time8>00:00:00</time8>
<obshtime8>00:00:00</obshtime8>
<babkizachas8>0</babkizachas8>
<dolg1>0</dolg1>
<dolg2>0</dolg2>
<dolg3>0</dolg3>
<dolg4>0</dolg4>
<dolg5>0</dolg5>
<dolg6>0</dolg6>
<dolg7>0</dolg7>
<dolg8>0</dolg8>
<zapas1>0</zapas1>
<zapas2>0</zapas2>
<zapas3>0</zapas3>
<zapas4>0</zapas4>
<zapas5>0</zapas5>
<zapas6>0</zapas6>
<zapas7>0</zapas7>
<zapas8>0</zapas8>
<dat1></dat1>
<dat2></dat2>
<dat3></dat3>
<dat4></dat4>
<dat5></dat5>
<dat6></dat6>
<dat7></dat7>
<dat8></dat8>
</student>
Как мне сделать так, чтобы вместо "id" (ИМЕННО НЕ Id1(по коду, в таблице указанно как "Фото") !!!) выводилась картинка
Ответы (1 шт):
Как это делается с автоматической генерацией ячеек - я не знаю, но знаю как делается без нее.
Сейчас будет много вопросов, но я постараюсь прокомментировать сложные моменты.
Полная разметка окошка с ручной разметкой колонок для DataGrid.
<Window x:Class="Students_Book_3._0.prepodupravPE"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Students_Book_3._0"
mc:Ignorable="d"
Title="prepodupravPE" Height="450" Width="800" Loaded="Window_Loaded">
<Window.Background>
<SolidColorBrush Color="DarkViolet"/>
</Window.Background>
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition/>
</Grid.RowDefinitions>
<DockPanel>
<ComboBox Width="120" SelectionChanged="ComboBox_SelectionChanged"/>
<Button Content="Поиск" Padding="10,5" Margin="10,0,0,0"/>
<Button Content="Добавить" HorizontalAlignment="Right" Padding="10,5"/>
</DockPanel>
<DataGrid ItemsSource="{Binding Students.StudentList}" Grid.Row="2" Background="#AA000000" SelectionChanged="grid_SelectionChanged" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}"/>
<DataGridTextColumn Header="ФИО" Width="*" Binding="{Binding Fio}"/>
<DataGridTemplateColumn Header="Фото">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding PhotoPath}" MaxWidth="70" MaxHeight="70"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Специфик">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Specifications}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Группа">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Groups}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Родители" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Parents}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Type}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Fio}"/>
<TextBlock Text=" ("/>
<TextBlock Text="{Binding Phone}"/>
<TextBlock Text=")"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Я исправил результаты вашей барьбы с разметкой, убрал ViewBox, сделал "резиновую" табличку (попробуйте поизменять размер окна).
Для использования Binding я назначил DataContext окна на сам класс окна. Вообще, так не делается, и опытные программисты используют шаблон программирования MVVM (это ссылка на документацию, но можно найти про это много материалов на русском, в том числе здесь, на StackOverflow). Но я позаимствовал оттуда применение INotifyPropertyChanged интерфейса. Суть его в том, что вместо того, чтобы назначать какое-либо свойство контролу, вы делаете наоборот - привязывете свойство контрола к свойству в классе, на который указывает DataContext, через Binding. При этом имя x:Name контролу больше не требуется, так как нет больше нужды к нему обращаться. А в коде, вы просто присваиваете свойству значение, как обычной переменной, и контрол это сразу увидит и обновит свой внешний вид.
Для обычных свойств используют вызов события PropertyChanged. Для коллекций вместо List можно использовать ObservableCollection, что в принципе то же самое, только внутри себя вызывает событие CollectionChanged, на которое все контролы с ItemsSource умеют реагировать. Удобно, не так ли?
А вот и весь код.
public partial class prepodupravPE : Window, INotifyPropertyChanged
{
private Students _students;
public static string StartupPath { get; } = AppDomain.CurrentDomain.BaseDirectory;
// В .NET Core возможно это работать не будет, но у вас же .NET Framework?
// Думаю, не сложно будет найти как получить путь к программе для .NET Core в этом случае.
public Students Students
{
get => _students;
set
{
_students = value;
OnPropertyChanged();
}
}
public prepodupravPE()
{
InitializeComponent();
DataContext = this; // вот эта штука важная
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
using (StreamReader sr = new StreamReader("declor/ConfigurationS.sb"))
{
XmlSerializer serializer = new XmlSerializer(typeof(Students));
Students = (Students)serializer.Deserialize(sr);
}
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void grid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Так как ваш XML был очень сложный, я его упростил, сделал так, чтобы одинаковые свойства были размечены в файле списками. Что-то где-то переименовал, изучайте.
<?xml version="1.0" encoding="utf-8"?>
<students>
<student>
<id>1</id>
<name>Данила</name>
<otch>Тычоевич</otch>
<fam>Крейзив</fam>
<photo>declor/photo1.jpg</photo>
<date>16.10.2007</date>
<specifications>
<specification>EV3</specification>
<specification>EV3</specification>
</specifications>
<groups>
<group>КМ-02</group>
<group>КМ-01</group>
</groups>
<balances>
<balance>320</balance>
<balance>280</balance>
</balances>
<colvozanats>
<colvozanat>0</colvozanat>
<colvozanat>0</colvozanat>
</colvozanats>
<poseshs>
<posesh>14</posesh>
<posesh>0</posesh>
</poseshs>
<oplatas>
<oplata>10</oplata>
<oplata>15</oplata>
</oplatas>
<school>0</school>
<ballys>
<bally>0</bally>
<bally>0</bally>
</ballys>
<prepod>Качалов Сергей Олегович</prepod>
<regdate>29.01.2020</regdate>
<status>Активен</status>
<skidos>0</skidos>
<parents>
<parent>
<type>Маман</type>
<fio>Что-то Тут</fio>
<phone>88001006868</phone>
</parent>
<parent>
<type>Папан</type>
<fio>Что-то Тут</fio>
<phone>88001007575</phone>
</parent>
<parent>
<type>Бабан</type>
<fio>Что-то Тут</fio>
<phone>88001008383</phone>
</parent>
<parent>
<type>Дедан</type>
<fio>Вин Ни Пух</fio>
<phone>88001001010</phone>
</parent>
</parents>
<lastcheng>88001001010</lastcheng>
<sessions>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
</sessions>
<payments>
<payment>
<amount>10</amount>
<date>01.01.2019</date>
</payment>
<payment>
<amount>20</amount>
<date>01.01.2020</date>
</payment>
</payments>
</student>
<student>
<id>1</id>
<name>Иван</name>
<otch>Иванович</otch>
<fam>Иванов</fam>
<photo>declor/photo2.jpg</photo>
<date>16.10.2007</date>
<specifications>
<specification>EV3</specification>
<specification>EV3</specification>
</specifications>
<groups>
<group>КМ-02</group>
<group>КМ-01</group>
</groups>
<balances>
<balance>320</balance>
<balance>280</balance>
</balances>
<colvozanats>
<colvozanat>0</colvozanat>
<colvozanat>0</colvozanat>
</colvozanats>
<poseshs>
<posesh>14</posesh>
<posesh>0</posesh>
</poseshs>
<oplatas>
<oplata>10</oplata>
<oplata>15</oplata>
</oplatas>
<school>0</school>
<ballys>
<bally>0</bally>
<bally>0</bally>
</ballys>
<prepod>Качалов Сергей Олегович</prepod>
<regdate>29.01.2020</regdate>
<status>Активен</status>
<skidos>0</skidos>
<parents>
<parent>
<type>Маман</type>
<fio>Что-то Тут</fio>
<phone>88001006868</phone>
</parent>
<parent>
<type>Папан</type>
<fio>Что-то Тут</fio>
<phone>88001007575</phone>
</parent>
<parent>
<type>Бабан</type>
<fio>Что-то Тут</fio>
<phone>88001008383</phone>
</parent>
<parent>
<type>Дедан</type>
<fio>Вин Ни Пух</fio>
<phone>88001001010</phone>
</parent>
</parents>
<lastcheng>88001001010</lastcheng>
<sessions>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
<session>
<nachalo>00:00:00</nachalo>
<konec>00:00:00</konec>
<time>00:00:00</time>
<obshtime>00:00:00</obshtime>
<babkizachas>0</babkizachas>
</session>
</sessions>
<payments>
<payment>
<amount>10</amount>
<date>01.01.2019</date>
</payment>
<payment>
<amount>20</amount>
<date>01.01.2020</date>
</payment>
</payments>
</student>
</students>
Я уверен, что у вас получится с использованием таких же приемов, что применил я при разметке XML, еще его упростить, превратив его в что-то более древовидное и интуитивно понятное. Смысл иерархии здесь в том, что объекты, импользуемые в программе для доступа к данным полностью повторяют структуру XML и наоборот, это позволяет грузить и сохранять XML буквально двумя строчками кода.
А вот и данные (не пугайтесь, я не вручную это писал, мне помог вот этот сайт, но то что он выдал, я немного оптимизировал, попробуйте поскармливать ему разные XML файлы и посмотрите на результат)
Важно: Старайтесь не хранить дублирующие друг друга данные, на пример ФИО и Фамилию+Имя+Отчество отдельно, ниже показано, как я делаю из трех свойств одно.
public class Parent
{
[XmlElement("type")]
public string Type { get; set; }
[XmlElement("fio")]
public string Fio { get; set; }
[XmlElement("phone")]
public string Phone { get; set; }
}
public class Session
{
[XmlElement("nachalo")]
public string Nachalo { get; set; }
[XmlElement("konec")]
public string Konec { get; set; }
[XmlElement("time")]
public string Time { get; set; }
[XmlElement("obshtime")]
public string Obshtime { get; set; }
[XmlElement("babkizachas")]
public string Babkizachas { get; set; }
}
public class Payment
{
[XmlElement("amount")]
public string Amount { get; set; }
[XmlElement("date")]
public string Date { get; set; }
}
public class Student
{
[XmlIgnore]
public string PhotoPath => prepodupravPE.StartupPath + Photo;
[XmlIgnore]
public string Fio => Fam + " " + Name + " " + Otch;
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("otch")]
public string Otch { get; set; }
[XmlElement("fam")]
public string Fam { get; set; }
[XmlElement("photo")]
public string Photo { get; set; }
[XmlElement("date")]
public string Date { get; set; }
[XmlArray("specifications")]
[XmlArrayItem("specification", typeof(string))]
public List<string> Specifications { get; set; }
[XmlArray("groups")]
[XmlArrayItem("group", typeof(string))]
public List<string> Groups { get; set; }
[XmlArray("balances")]
[XmlArrayItem("balance", typeof(string))]
public List<string> Balances { get; set; }
[XmlArray("colvozanats")]
[XmlArrayItem("colvozanat", typeof(string))]
public List<string> Colvozanats { get; set; }
[XmlArray("poseshs")]
[XmlArrayItem("posesh", typeof(string))]
public List<string> Poseshs { get; set; }
[XmlArray("oplatas")]
[XmlArrayItem("oplata", typeof(string))]
public List<string> Oplatas { get; set; }
[XmlElement("school")]
public string School { get; set; }
[XmlArray("ballys")]
[XmlArrayItem("bally", typeof(string))]
public List<string> Ballys { get; set; }
[XmlElement("prepod")]
public string Prepod { get; set; }
[XmlElement("regdate")]
public string Regdate { get; set; }
[XmlElement("status")]
public string Status { get; set; }
[XmlElement("skidos")]
public string Skidos { get; set; }
[XmlArray("parents")]
[XmlArrayItem("parent", typeof(Parent))]
public List<Parent> Parents { get; set; }
[XmlElement("lastcheng")]
public string Lastcheng { get; set; }
[XmlArray("sessions")]
[XmlArrayItem("session", typeof(Session))]
public List<Session> Sessions { get; set; }
[XmlArray("payments")]
[XmlArrayItem("payment",typeof(Payment))]
public List<Payment> Payments { get; set; }
}
[XmlRoot("students")]
public class Students
{
[XmlElement("student")]
public List<Student> StudentList { get; set; }
}
Картинки нужно положить по тому пути относительно программы, по которому указано в XML файле выше. Успехов!

