Пагинация для desktop

This commit is contained in:
Данияр Аглиуллов 2023-03-17 19:15:58 +04:00
parent 506f8c8c14
commit 57aecf6cb6
8 changed files with 152 additions and 7 deletions

View File

@ -3,6 +3,7 @@ using ConfectioneryContracts.BusinessLogicsContracts;
using ConfectioneryContracts.SearchModels; using ConfectioneryContracts.SearchModels;
using ConfectioneryContracts.StoragesContract; using ConfectioneryContracts.StoragesContract;
using ConfectioneryContracts.ViewModels; using ConfectioneryContracts.ViewModels;
using DocumentFormat.OpenXml.EMMA;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -16,10 +17,10 @@ namespace ConfectioneryBusinessLogic
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IMessageInfoStorage _messageInfoStorage; private readonly IMessageInfoStorage _messageInfoStorage;
public MessageInfoLogic(ILogger<MessageInfoLogic> logger, IMessageInfoStorage MessageInfoStorage) public MessageInfoLogic(ILogger<MessageInfoLogic> logger, IMessageInfoStorage messageInfoStorage)
{ {
_logger = logger; _logger = logger;
_messageInfoStorage = MessageInfoStorage; _messageInfoStorage = messageInfoStorage;
} }
public bool Create(MessageInfoBindingModel model) public bool Create(MessageInfoBindingModel model)
@ -44,5 +45,18 @@ namespace ConfectioneryBusinessLogic
_logger.LogInformation("ReadList. Count:{Count}", list.Count); _logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list; return list;
} }
public List<MessageInfoViewModel>? ReadPage(int page, int pageSize)
{
_logger.LogInformation("ReadPage. page: {page}, pageSize: {pageSize} ", page, pageSize);
var list = _messageInfoStorage.GetListOnPage(page, pageSize);
if (list == null)
{
_logger.LogWarning("ReadPage. Uncorrect range messages for page");
return null;
}
_logger.LogInformation("ReadPage. Count:{Count}", list.Count);
return list;
}
} }
} }

View File

@ -24,6 +24,17 @@ namespace ConfectioneryFileImplement
return null; return null;
} }
public List<MessageInfoViewModel>? GetListOnPage(int page, int pageSize)
{
if (page * pageSize >= _source.Messages.Count)
{
return null;
}
return _source.Messages.Skip((page - 1) * pageSize).Take(pageSize)
.Select(x => x.GetViewModel)
.ToList();
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{ {
return _source.Messages return _source.Messages

View File

@ -24,6 +24,20 @@ namespace ConfectioneryListImplement
return null; return null;
} }
public List<MessageInfoViewModel>? GetListOnPage(int page, int pageSize)
{
if (page * pageSize >= _source.Messages.Count)
{
return null;
}
List<MessageInfoViewModel> result = new();
for (var i = (page - 1) * pageSize; i < page * pageSize; i++)
{
result.Add(_source.Messages[i].GetViewModel);
}
return result;
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{ {
List<MessageInfoViewModel> result = new(); List<MessageInfoViewModel> result = new();

View File

@ -29,24 +29,62 @@
private void InitializeComponent() private void InitializeComponent()
{ {
dataGridView = new DataGridView(); dataGridView = new DataGridView();
buttonPrevPage = new Button();
buttonNextPage = new Button();
labelInfoPages = new Label();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// dataGridView // dataGridView
// //
dataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(0, 0); dataGridView.Location = new Point(0, 0);
dataGridView.Name = "dataGridView"; dataGridView.Name = "dataGridView";
dataGridView.RowTemplate.Height = 25; dataGridView.RowTemplate.Height = 25;
dataGridView.Size = new Size(803, 450); dataGridView.Size = new Size(730, 454);
dataGridView.TabIndex = 0; dataGridView.TabIndex = 0;
// //
// buttonPrevPage
//
buttonPrevPage.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonPrevPage.Location = new Point(12, 460);
buttonPrevPage.Name = "buttonPrevPage";
buttonPrevPage.Size = new Size(75, 23);
buttonPrevPage.TabIndex = 1;
buttonPrevPage.Text = "<<<";
buttonPrevPage.UseVisualStyleBackColor = true;
buttonPrevPage.Click += ButtonPrevPage_Click;
//
// buttonNextPage
//
buttonNextPage.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonNextPage.Location = new Point(203, 460);
buttonNextPage.Name = "buttonNextPage";
buttonNextPage.Size = new Size(75, 23);
buttonNextPage.TabIndex = 2;
buttonNextPage.Text = ">>>";
buttonNextPage.UseVisualStyleBackColor = true;
buttonNextPage.Click += ButtonNextPage_Click;
//
// labelInfoPages
//
labelInfoPages.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
labelInfoPages.Location = new Point(93, 464);
labelInfoPages.Name = "labelInfoPages";
labelInfoPages.Size = new Size(104, 19);
labelInfoPages.TabIndex = 3;
labelInfoPages.Text = "{0} страница";
labelInfoPages.TextAlign = ContentAlignment.MiddleCenter;
//
// FormViewMail // FormViewMail
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450); ClientSize = new Size(727, 498);
Controls.Add(labelInfoPages);
Controls.Add(buttonNextPage);
Controls.Add(buttonPrevPage);
Controls.Add(dataGridView); Controls.Add(dataGridView);
Name = "FormViewMail"; Name = "FormViewMail";
Text = "Письма"; Text = "Письма";
@ -58,5 +96,8 @@
#endregion #endregion
private DataGridView dataGridView; private DataGridView dataGridView;
private Button buttonPrevPage;
private Button buttonNextPage;
private Label labelInfoPages;
} }
} }

View File

@ -10,6 +10,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using ConfectioneryContracts.ViewModels;
namespace ConfectioneryView namespace ConfectioneryView
{ {
@ -17,19 +18,27 @@ namespace ConfectioneryView
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IMessageInfoLogic _logic; private readonly IMessageInfoLogic _logic;
private int currentPage = 1;
public int pageSize = 5;
public FormViewMail(ILogger<FormViewMail> logger, IMessageInfoLogic logic) public FormViewMail(ILogger<FormViewMail> logger, IMessageInfoLogic logic)
{ {
InitializeComponent(); InitializeComponent();
_logger = logger; _logger = logger;
_logic = logic; _logic = logic;
buttonPrevPage.Enabled = false;
} }
private void FormViewMail_Load(object sender, EventArgs e) private void FormViewMail_Load(object sender, EventArgs e)
{
MailLoad();
}
private bool MailLoad()
{ {
try try
{ {
var list = _logic.ReadList(null); var list = _logic.ReadPage(currentPage, pageSize);
if (list != null) if (list != null)
{ {
dataGridView.DataSource = list; dataGridView.DataSource = list;
@ -38,12 +47,49 @@ namespace ConfectioneryView
dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
} }
_logger.LogInformation("Загрузка списка писем"); _logger.LogInformation("Загрузка списка писем");
labelInfoPages.Text = $"{currentPage} страница";
return true;
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Ошибка загрузки писем"); _logger.LogError(ex, "Ошибка загрузки писем");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
MessageBoxIcon.Error); MessageBoxIcon.Error);
return false;
}
}
private void ButtonPrevPage_Click(object sender, EventArgs e)
{
if (currentPage == 1)
{
_logger.LogWarning("Неккоректный номер страницы {page}", currentPage - 1);
return;
}
currentPage--;
if (MailLoad())
{
buttonNextPage.Enabled = true;
if (currentPage == 1)
{
buttonPrevPage.Enabled = false;
}
}
}
private void ButtonNextPage_Click(object sender, EventArgs e)
{
currentPage++;
if (!MailLoad() || ((List<MessageInfoViewModel>)dataGridView.DataSource).Count == 0)
{
_logger.LogWarning("Out of range messages");
currentPage--;
MailLoad();
buttonNextPage.Enabled = false;
}
else
{
buttonPrevPage.Enabled = true;
} }
} }
} }

View File

@ -14,5 +14,7 @@ namespace ConfectioneryContracts.BusinessLogicsContracts
List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model); List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
bool Create(MessageInfoBindingModel model); bool Create(MessageInfoBindingModel model);
public List<MessageInfoViewModel>? ReadPage(int page, int pageSize);
} }
} }

View File

@ -13,6 +13,8 @@ namespace ConfectioneryContracts.StoragesContract
{ {
List<MessageInfoViewModel> GetFullList(); List<MessageInfoViewModel> GetFullList();
List<MessageInfoViewModel>? GetListOnPage(int page, int pageSize);
List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model); List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model);
MessageInfoViewModel? GetElement(MessageInfoSearchModel model); MessageInfoViewModel? GetElement(MessageInfoSearchModel model);

View File

@ -19,6 +19,21 @@ namespace ConfectioneryDatabaseImplement
return null; return null;
} }
public List<MessageInfoViewModel>? GetListOnPage(int page, int pageSize)
{
using var context = new ConfectioneryDatabase();
try
{
return context.Messages.Skip((page - 1) * pageSize).Take(pageSize)
.Select(x => x.GetViewModel)
.ToList();
}
catch (Exception)
{
return null;
}
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{ {
using var context = new ConfectioneryDatabase(); using var context = new ConfectioneryDatabase();