Добавил абстрактную форму деталки

This commit is contained in:
Никита Потапов 2024-05-15 15:27:40 +04:00
parent 48f3831c95
commit 54da29877b
15 changed files with 382 additions and 19 deletions

View File

@ -68,12 +68,14 @@
ApplyToolStripMenuItem.Name = "ApplyToolStripMenuItem";
ApplyToolStripMenuItem.Size = new Size(97, 24);
ApplyToolStripMenuItem.Text = "Сохранить";
ApplyToolStripMenuItem.Click += ApplyToolStripMenuItem_Click;
//
// CancelToolStripMenuItem
//
CancelToolStripMenuItem.Name = "CancelToolStripMenuItem";
CancelToolStripMenuItem.Size = new Size(76, 24);
CancelToolStripMenuItem.Text = "Отмена";
CancelToolStripMenuItem.Click += CancelToolStripMenuItem_Click;
//
// FormDiagnose
//
@ -86,6 +88,7 @@
MinimumSize = new Size(0, 125);
Name = "FormDiagnose";
Text = "Редактировать диагноз";
Load += FormDiagnose_Load;
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);

View File

@ -1,10 +1,78 @@
namespace MedicalView.Diagnoses
using MedicalDatabaseContracts;
using MedicalDatabaseContracts.Models;
using MedicalDatabaseContracts.SearchModels;
using MedicalDatabaseContracts.ViewModels;
using Microsoft.Extensions.Logging;
namespace MedicalView.Diagnoses
{
public partial class FormDiagnose : Form
public partial class FormDiagnose : FormAbstractDetail
{
public FormDiagnose()
private readonly ILogger<FormDiagnose> _logger;
private readonly ILogic<Diagnose, DiagnoseViewModel, DiagnoseSearchModel> _diagnoseLogic;
public FormDiagnose(ILogger<FormDiagnose> logger,
ILogic<Diagnose, DiagnoseViewModel, DiagnoseSearchModel> diagnoseLogic)
{
InitializeComponent();
_diagnoseLogic = diagnoseLogic;
_logger = logger;
}
private void FormDiagnose_Load(object sender, EventArgs e)
{
if (ModelId.HasValue)
{
try
{
_logger.LogInformation("Получение диагноза");
var view = _diagnoseLogic.ReadElement(ModelId.Value);
if (view != null)
{
textBoxName.Text = view.Name;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения диагноза");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void CancelToolStripMenuItem_Click(object sender, EventArgs e)
{
Cancel();
}
private void ApplyToolStripMenuItem_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxName.Text))
{
MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_logger.LogInformation("Сохранение диагноза");
try
{
var model = new Diagnose
{
Id = ModelId ?? 0,
Name = textBoxName.Text,
};
var operationResult = ModelId.HasValue ? _diagnoseLogic.Update(model) : _diagnoseLogic.Create(model);
if (!operationResult)
{
throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка сохранения диагноза");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@ -2,11 +2,12 @@
using MedicalDatabaseContracts.Models;
using MedicalDatabaseContracts.SearchModels;
using MedicalDatabaseContracts.ViewModels;
using MedicalView.Visits;
using Microsoft.Extensions.Logging;
namespace MedicalView.Diagnoses
{
public class FormDiagnoses : FormAbstractList<Diagnose, DiagnoseViewModel, DiagnoseSearchModel>
public class FormDiagnoses : FormAbstractList<Diagnose, DiagnoseViewModel, DiagnoseSearchModel, FormDiagnose>
{
public FormDiagnoses(
ILogger<FormDiagnoses> logger,

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,6 +1,6 @@
namespace MedicalView.Doctors
{
public partial class FormDoctor : Form
public partial class FormDoctor : FormAbstractDetail
{
public FormDoctor()
{

View File

@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace MedicalView.Doctors
{
public class FormDoctors : FormAbstractList<Doctor, DoctorViewModel, DoctorSearchModel>
public class FormDoctors : FormAbstractList<Doctor, DoctorViewModel, DoctorSearchModel, FormDoctor>
{
public FormDoctors(
ILogger<FormDoctors> logger,

View File

@ -0,0 +1,12 @@
namespace MedicalView
{
public class FormAbstractDetail : Form
{
public int? ModelId { protected get; set; }
protected virtual void Cancel()
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,6 +1,6 @@
namespace MedicalView
{
partial class FormAbstractList<M, V, S>
partial class FormAbstractList<M, V, S, F>
{
/// <summary>
/// Required designer variable.
@ -70,7 +70,7 @@
изменитьToolStripMenuItem.Name = "изменитьToolStripMenuItem";
изменитьToolStripMenuItem.Size = new Size(92, 24);
изменитьToolStripMenuItem.Text = "Изменить";
изменитьToolStripMenuItem.Click += EsitItemToolStripMenuItem_Click;
изменитьToolStripMenuItem.Click += EditItemToolStripMenuItem_Click;
//
// удалитьToolStripMenuItem
//

View File

@ -8,14 +8,15 @@ using Microsoft.Extensions.Logging;
namespace MedicalView
{
public partial class FormAbstractList<M, V, S> : Form
public partial class FormAbstractList<M, V, S, F> : Form
where M : AbstractModel
where V : AbstractViewModel
where S : AbstractSearchModel
where F : FormAbstractDetail
{
protected ILogger _logger;
protected ILogic<M, V, S> _logic;
public FormAbstractList(ILogger<FormAbstractList<M, V, S>> logger, ILogic<M, V, S> logic)
public FormAbstractList(ILogger<FormAbstractList<M, V, S, F>> logger, ILogic<M, V, S> logic)
{
InitializeComponent();
_logger = logger;
@ -34,17 +35,55 @@ namespace MedicalView
protected virtual void AddItemToolStripMenuItem_Click(object sender, EventArgs e)
{
// code
var service = Program.ServiceProvider?.GetService(typeof(F));
if (service is F form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
protected virtual void EsitItemToolStripMenuItem_Click(object sender, EventArgs e)
protected virtual void EditItemToolStripMenuItem_Click(object sender, EventArgs e)
{
// code
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(F));
if (service is F form)
{
form.ModelId = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
}
protected virtual void DeleteItemToolStripMenuItem_Click(object sender, EventArgs e)
{
// code
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
_logger.LogInformation("Удаление элемента");
try
{
if (!_logic.Delete(id))
{
throw new Exception("Ошибка при удалении. Дополнительная информация в логах.");
}
LoadData();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка удаления элемента");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
protected virtual void LoadData()

View File

@ -1,6 +1,6 @@
namespace MedicalView.Patients
{
public partial class FormPatient : Form
public partial class FormPatient : FormAbstractDetail
{
public FormPatient()
{

View File

@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace MedicalView.Patients
{
public class FormPatients : FormAbstractList<Patient, PatientViewModel, PatientSearchModel>
public class FormPatients : FormAbstractList<Patient, PatientViewModel, PatientSearchModel, FormPatient>
{
public FormPatients(
ILogger<FormPatients> logger,

View File

@ -1,6 +1,6 @@
namespace MedicalView.Specializations
{
public partial class FormSpecialization : Form
public partial class FormSpecialization : FormAbstractDetail
{
public FormSpecialization()
{

View File

@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace MedicalView.Specializations
{
public class FormSpecializations : FormAbstractList<Specialization, SpecializationViewModel, SpecializationSearchModel>
public class FormSpecializations : FormAbstractList<Specialization, SpecializationViewModel, SpecializationSearchModel, FormSpecialization>
{
public FormSpecializations(
ILogger<FormSpecializations> logger,

View File

@ -1,6 +1,6 @@
namespace MedicalView.Visits
{
public partial class FormVisit : Form
public partial class FormVisit : FormAbstractDetail
{
public FormVisit()
{