using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
namespace MesWork.Pages
{
///
/// 通用分页状态栏控件 — 嵌入到任何页面底部
/// 包含:记录数标签 | 每页条数下拉 | 上一页 | 页码信息 | 下一页
///
public class PagerBar : Panel
{
public event EventHandler PageChanged;
private Label lbl_RecordCount;
private ComboBox cmb_PageSize;
private Button btn_Prev;
private Label lbl_PageInfo;
private Button btn_Next;
private int _currentPage = 1;
private int _totalPage = 1;
private int _totalCount = 0;
private int _pageSize = 100;
public int CurrentPage => _currentPage;
public int PageSize => _pageSize;
public int TotalCount => _totalCount;
public PagerBar()
{
this.BackColor = Color.White;
this.Dock = DockStyle.Bottom;
this.Height = 40;
var tbl = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 1
};
tbl.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tbl.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
this.Controls.Add(tbl);
// 左侧 — 记录数
lbl_RecordCount = new Label
{
AutoSize = true,
Anchor = AnchorStyles.Left,
Font = new Font("微软雅黑", 10F),
ForeColor = Color.FromArgb(55, 65, 81),
Margin = new Padding(16, 0, 0, 0),
Text = "共 0 条记录"
};
tbl.Controls.Add(lbl_RecordCount, 0, 0);
// 右侧 — 分页控件 (RightToLeft)
var flow = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.RightToLeft,
WrapContents = false
};
tbl.Controls.Add(flow, 1, 0);
// 下一页
btn_Next = CreatePageButton("下一页 ▶");
btn_Next.Click += (s, e) => { if (_currentPage < _totalPage) { _currentPage++; PageChanged?.Invoke(this, EventArgs.Empty); } };
flow.Controls.Add(btn_Next);
// 页码信息
lbl_PageInfo = new Label
{
AutoSize = true,
Font = new Font("微软雅黑", 10F),
ForeColor = Color.FromArgb(55, 65, 81),
Margin = new Padding(4, 10, 4, 0),
Text = "第 1 页 / 共 1 页"
};
flow.Controls.Add(lbl_PageInfo);
// 上一页
btn_Prev = CreatePageButton("◀ 上一页");
btn_Prev.Click += (s, e) => { if (_currentPage > 1) { _currentPage--; PageChanged?.Invoke(this, EventArgs.Empty); } };
flow.Controls.Add(btn_Prev);
// 每页条数下拉
cmb_PageSize = new ComboBox
{
DropDownStyle = ComboBoxStyle.DropDownList,
Font = new Font("微软雅黑", 9F),
Size = new Size(70, 26),
Margin = new Padding(4, 7, 8, 0)
};
cmb_PageSize.Items.AddRange(new object[] { "50", "100", "200", "500", "1000" });
cmb_PageSize.SelectedItem = "100";
cmb_PageSize.SelectedIndexChanged += (s, e) =>
{
_pageSize = int.Parse(cmb_PageSize.Text);
_currentPage = 1;
PageChanged?.Invoke(this, EventArgs.Empty);
};
flow.Controls.Add(cmb_PageSize);
var lblSize = new Label
{
AutoSize = true,
Font = new Font("微软雅黑", 9F),
ForeColor = Color.FromArgb(100, 116, 139),
Margin = new Padding(4, 11, 0, 0),
Text = "每页"
};
flow.Controls.Add(lblSize);
}
///
/// 重置到第1页(查询按钮调用)
///
public void ResetPage() => _currentPage = 1;
///
/// 更新分页状态(SP调用后调用)
///
public void UpdateState(SqlParameter pageCountParam, SqlParameter itemCountParam)
{
_totalPage = pageCountParam.Value != DBNull.Value ? Convert.ToInt32(pageCountParam.Value) : 1;
_totalCount = itemCountParam.Value != DBNull.Value ? Convert.ToInt32(itemCountParam.Value) : 0;
if (_totalPage < 1) _totalPage = 1;
lbl_RecordCount.Text = $"共 {_totalCount} 条记录";
lbl_PageInfo.Text = $"第 {_currentPage} 页 / 共 {_totalPage} 页";
btn_Prev.Enabled = _currentPage > 1;
btn_Next.Enabled = _currentPage < _totalPage;
}
///
/// 简易更新(直接传总条数,不分页的模块用)
///
public void UpdateCount(int count)
{
lbl_RecordCount.Text = $"共 {count} 条记录";
}
///
/// 创建分页 Output 参数对
///
public static (SqlParameter pageCount, SqlParameter itemCount) CreateOutputParams()
{
return (
new SqlParameter("@PageCount", SqlDbType.Int) { Direction = ParameterDirection.Output },
new SqlParameter("@ItemCount", SqlDbType.Int) { Direction = ParameterDirection.Output }
);
}
private Button CreatePageButton(string text)
{
var btn = new Button
{
BackColor = Color.FromArgb(74, 144, 217),
Cursor = Cursors.Hand,
FlatStyle = FlatStyle.Flat,
Font = new Font("微软雅黑", 9F, FontStyle.Bold),
ForeColor = Color.White,
Margin = new Padding(4, 6, 4, 0),
Size = new Size(72, 28),
Text = text,
UseVisualStyleBackColor = false
};
btn.FlatAppearance.BorderSize = 0;
return btn;
}
}
}