Я сохраняю в json-файл введённые данные. Так же есть блоки, которых может быть неограниченное количество(динамические), которые я добавляю по нажатии кнопки. Я привожу пример структуры и как создаются эти блоки на примере servicetype.
Моя проблема в том, что на первое место выходит динамические блоки, а статика оказывается ниже...(на скрине видно, то servicetype и measures... вверху, но мне надо, чтобы они шли по примеру, в распорядке, который написан в классе incident.) Можно ли так сделать и как ?
class Incident
{
public string fincertId { get; set; }
public string fixationAt { get; set; }
public string description { get; set; }
public lawEnforcementRequest lawEnforcementRequest { get; set; }
public string assistance { get; set; }
public string vectorCode { get; set; }
public List<serviceType> serviceType = new List<serviceType>();
public string typeOfAttack { get; set; }
public List<measuresAndRecomendations> measuresAndRecomendations = new List<measuresAndRecomendations>();
}
private void Button5_Click(object sender, EventArgs e)
{
tableLayoutPanel3.SuspendLayout();
tableLayoutPanel3.RowCount++;
var label0 = new Label();
label0.Size = new System.Drawing.Size(150, 40);
label0.Text = "Блок" + (b + 1).ToString();
tableLayoutPanel3.Controls.Add(label0, 0, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tableLayoutPanel3.RowCount++;
var label = new Label();
label.Text = "sourceId";
tableLayoutPanel3.Controls.Add(label, 0, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
textBoxes.Add(new TextBox());
textBoxes[o].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
tableLayoutPanel3.Controls.Add(textBoxes[o], 1, tableLayoutPanel3.RowCount - 1);//добавили на форму
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
o++;
tableLayoutPanel3.RowCount++;
var label1 = new Label();
label1.Text = "type";
tableLayoutPanel3.Controls.Add(label1, 0, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
cCheckedLists.Add(new cCheckedListBox());
cCheckedLists[b].Items.AddRange(variants);
cCheckedLists[b].Size = new System.Drawing.Size(298, 150);
cCheckedLists[b].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
tableLayoutPanel3.Controls.Add(cCheckedLists[b], 1, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tableLayoutPanel3.RowCount++;
var label2 = new Label();
label2.Text = "name";
tableLayoutPanel3.Controls.Add(label2, 0, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
textBoxes.Add(new TextBox());
textBoxes[o].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
tableLayoutPanel3.Controls.Add(textBoxes[o], 1, tableLayoutPanel3.RowCount - 1);//добавили на форму
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tableLayoutPanel3.RowCount++;
o++;
var label3 = new Label();
label3.Text = "version";
tableLayoutPanel3.Controls.Add(label3, 0, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
textBoxes.Add(new TextBox());
textBoxes[o].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
tableLayoutPanel3.Controls.Add(textBoxes[o], 1, tableLayoutPanel3.RowCount - 1);//добавили на форму
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
o++;
tableLayoutPanel3.RowCount++;
var label4 = new Label();
label4.Text = "description";
tableLayoutPanel3.Controls.Add(label4, 0, tableLayoutPanel3.RowCount - 1);
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
textBoxes.Add(new TextBox());
textBoxes[o].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
tableLayoutPanel3.Controls.Add(textBoxes[o], 1, tableLayoutPanel3.RowCount - 1);//добавили на форму
tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tableLayoutPanel3.ResumeLayout();
o++;
b++;
}
private void Button2_Click(object sender, EventArgs e)
{
//tabControl1.SelectedTab = tabPage2;
SaveFileDialog saveFileDialog1 = new SaveFileDialog();// это часть магии для сохранения файла,вывод окно с выбором куда и с каким именем сохранять. её просто копировать
saveFileDialog1.Filter = "JSON files(*.json)|*.json|All files(*.*)|*.*";
if (saveFileDialog1.ShowDialog() == DialogResult.Cancel)
{
return;
}
Incident incident = new Incident
{
fincertId = textBox1.Text,
fixationAt = textBox9.Text,
description = textBox10.Text,
assistance = cCheckedListBox3.Text,
vectorCode = cCheckedListBox4.Text,
typeOfAttack = cCheckedListBox5.Text,
};
lawEnforcementRequest lawEnforcementRequest = new lawEnforcementRequest
{
addressed = cCheckedListBox1.Text,
request = cCheckedListBox2.Text,
number = textBox11.Text,
numberTicket = textBox12.Text,
dateTimeAt = textBox13.Text,
};
incident.lawEnforcementRequest = lawEnforcementRequest;
int typecheck = 0;
for (int i = 0; i < o; i = i + 4)
{
serviceType test = new serviceType
{
sourceId = textBoxes[i].Text,
type = cCheckedLists[typecheck].Text,
name = textBoxes[i + 1].Text,
version = textBoxes[i + 2].Text,
description = textBoxes[i + 3].Text,
};
incident.serviceType.Add(test);
typecheck++;
}
string json = JsonConvert.SerializeObject(incident, Formatting.Indented);//завершающая часть сохранения файла
string filename = saveFileDialog1.FileName;
System.IO.File.WriteAllText(filename, json);
// System.Console.WriteLine(json);//вывод
MessageBox.Show("Файл сохранен", "Успех!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
Библиотека Json.Net которой вы пользуетесь поддерживает указание порядка полей:
[JsonProperty(Order = 1)]
Ну и расставьте вручную как вам надо:
class Incident
{
[JsonProperty(Order = 10)]
public string fincertId { get; set; }
[JsonProperty(Order = 20)]
public string fixationAt { get; set; }
Хотя я не знаю, зачем такое нужно... При сериализации/десериализации порядок совершенно неважен на мой взгляд, разве что для чисто эстетической красоты.
А потом ещё если придётся поле в середину вклинивать... Поэтому в примере и сделал нумерацию "как в бейсике" - через десять, обычно хватает на некоторое время вставить между номерами без перенумерации при рефакторинге на скорую руку.
Продвижение своими сайтами как стратегия роста и независимости