Подскажите. Всё что я имею это:
public Form1()
{
InitializeComponent();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void XML_Click(object sender, EventArgs e)
{
}
xml такой
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<graph>
<title>Dijkstra</title>
<points>
<point id="1" y="3" x="1"/>
</points>
<lines>
<line id="1" weight="10" to="2" from="1"/>
</lines>
</graph>
Для такого файла
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<graph>
<title>Dijkstra</title>
<points>
<point id="1" y="3" x="1"/>
<point id="2" y="30" x="10"/>
<point id="3" y="300" x="100"/>
</points>
<lines>
<line id="1" weight="10" to="2" from="1"/>
<line id="2" weight="100" to="20" from="10"/>
<line id="3" weight="1000" to="200" from="100"/>
</lines>
получилось так
Идем сюда и получаем такой набор классов
namespace WinFormsAppXmlParse
{
[XmlRoot(ElementName = "point")]
public class Point
{
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "y")]
public string Y { get; set; }
[XmlAttribute(AttributeName = "x")]
public string X { get; set; }
}
[XmlRoot(ElementName = "points")]
public class Points
{
[XmlElement(ElementName = "point")]
public List<Point> Point { get; set; }
}
[XmlRoot(ElementName = "line")]
public class Line
{
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "weight")]
public string Weight { get; set; }
[XmlAttribute(AttributeName = "to")]
public string To { get; set; }
[XmlAttribute(AttributeName = "from")]
public string From { get; set; }
}
[XmlRoot(ElementName = "lines")]
public class Lines
{
[XmlElement(ElementName = "line")]
public List<Line> Line { get; set; }
}
[XmlRoot(ElementName = "graph")]
public class Graph
{
[XmlElement(ElementName = "title")]
public string Title { get; set; }
[XmlElement(ElementName = "points")]
public Points Points { get; set; }
[XmlElement(ElementName = "lines")]
public Lines Lines { get; set; }
}
}
Будем работать в духе MVP
, вот интерфейс и кодбихайнд формы, который она реализует
public interface IMainForm
{
string Output { get; set; }
event EventHandler<string> SelectedFile;
event EventHandler<string> SelectedNode;
}
public partial class MainForm : Form, IMainForm
{
public MainForm()
{
InitializeComponent();
}
public string Output
{
get => textBoxOutput.Text;
set => textBoxOutput.Text = value;
}
//событие выбора файла
public event EventHandler<string> SelectedFile;
//событие выбора в listbox
public event EventHandler<string> SelectedNode;
//выбор файла
private void buttonSelectFile_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
System.IO.FileInfo example = new System.IO.FileInfo("file.xml");
openFileDialog.CheckFileExists = true;
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
openFileDialog.Filter = string.Format("{0} файлы ({1})|*{1}|Все файлы (*.*)|*.*",
example.Extension.Substring(1).ToUpper(),
example.Extension);
var result = openFileDialog.ShowDialog();
if (result == DialogResult.OK)
{
textBoxFile.Text = openFileDialog.FileName;
textBoxOutput.Text = String.Empty;
//вызываем событие выбора файла
SelectedFile?.Invoke(this, openFileDialog.FileName);
}
else
{
textBoxFile.Text = String.Empty;
textBoxOutput.Text = String.Empty;
}
}
//выбор раздела
private void listBoxSelectNode_SelectedValueChanged(object sender, EventArgs e)
{
var item = listBoxSelectNode.SelectedItem.ToString();
//вызываем событие выбора в listbox
SelectedNode?.Invoke(this, item);
}
}
Вот класс Presenter
а, в котором поработаем с xml
public class Presenter
{
private readonly IMainForm _mainForm;
private Graph _graph;
//ctor
public Presenter(IMainForm mainForm)
{
_mainForm = mainForm ?? throw new ArgumentNullException(nameof(mainForm));
_mainForm.SelectedFile += _mainForm_SelectedFile;
_mainForm.SelectedNode += _mainForm_SelectedNode;
}
/// <summary>
/// Выбран файл
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _mainForm_SelectedFile(object sender, string file)
{
if (String.IsNullOrEmpty(file)) throw new ArgumentNullException(file);
XmlSerializer serializer = new XmlSerializer(typeof(Graph));
// читаем файл и десериализуем
using (StreamReader sr = new StreamReader(file))
{
_graph = (Graph)serializer.Deserialize(sr);
}
}
/// <summary>
/// Выбрана нода
/// </summary>
/// <param name="sender"></param>
/// <param name="item"></param>
private void _mainForm_SelectedNode(object sender, string item)
{
if (String.IsNullOrEmpty(item)) throw new ArgumentNullException(item);
if (_graph == null) return;
switch (item)
{
case "title":
_mainForm.Output = _graph.Title;
break;
case "points":
_mainForm.Output = ShowPoints(_graph.Points);
break;
case "lines":
_mainForm.Output = ShowLines(_graph.Lines);
break;
default:
throw new ArgumentException(nameof(item));
}
}
/// <summary>
/// Формирование вывода Точек
/// </summary>
/// <param name="points"></param>
/// <returns></returns>
private string ShowPoints(Points points)
{
StringBuilder sb = new StringBuilder();
foreach (var point in points.Point)
{
var str = $"Точка:{point.Id} - X:{point.X}, Y:{point.Y}";
sb.AppendLine(str);
}
return sb.ToString();
}
/// <summary>
/// Формирование вывода Линий
/// </summary>
/// <param name="lines"></param>
/// <returns></returns>
private string ShowLines(Lines lines)
{
StringBuilder sb = new StringBuilder();
foreach (var line in lines.Line)
{
var str = $"Линия:{line.Id} - начало:{line.From}, конец:{line.To}, толщина:{line.Weight}";
sb.AppendLine(str);
}
return sb.ToString();
}
}
Presenter
и View
(форму) свяжем между собой в Program.cs
так
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainForm form = new MainForm();
Presenter presenter = new Presenter(form);
Application.Run(form);
}
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Проблемам в следующемВыдаёт ошибку:
В общем, дело обстоит так: нужно получать данные о карте игры с сервераСервер возвращает JSON- строку, в которой есть массив из словарей
Как реализовать идею бота оповещений на C# для Telegram? У нас есть метод Bot_OnMessage, который вызывается всегда, когда бот получает сообщениеВопрос:...