185 lines
7.8 KiB
C#
185 lines
7.8 KiB
C#
using System;
|
||
using System.Data;
|
||
using System.Data.SqlClient;
|
||
using System.Drawing;
|
||
using System.Windows.Forms;
|
||
|
||
namespace MesWork.Pages
|
||
{
|
||
/// <summary>
|
||
/// CRUD页面通用辅助方法(搜索框交互、弹窗控件创建、Excel导出)
|
||
/// </summary>
|
||
public static class CrudHelper
|
||
{
|
||
// ====================================================================
|
||
// 搜索框占位提示交互
|
||
// ====================================================================
|
||
|
||
/// <summary>
|
||
/// 搜索框获得焦点时清除占位提示
|
||
/// </summary>
|
||
public static void SearchBox_GotFocus(TextBox txt, string hint)
|
||
{
|
||
if (txt.Text == hint) { txt.Text = ""; txt.ForeColor = Color.FromArgb(31, 41, 55); }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 搜索框失去焦点时恢复占位提示
|
||
/// </summary>
|
||
public static void SearchBox_LostFocus(TextBox txt, string hint)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(txt.Text)) { txt.Text = hint; txt.ForeColor = Color.FromArgb(156, 163, 175); }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 搜索框回车触发搜索
|
||
/// </summary>
|
||
public static bool SearchBox_KeyDown(KeyEventArgs e)
|
||
{
|
||
if (e.KeyCode == Keys.Enter) { e.SuppressKeyPress = true; return true; }
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取搜索框的实际搜索关键词(排除占位提示)
|
||
/// </summary>
|
||
public static string GetSearchKeyword(TextBox txt, string hint)
|
||
{
|
||
return txt.Text == hint ? "" : txt.Text.Trim();
|
||
}
|
||
|
||
// ====================================================================
|
||
// 编辑弹窗辅助
|
||
// ====================================================================
|
||
|
||
/// <summary>
|
||
/// 创建标准编辑弹窗框架(统一样式 + 确定/取消按钮)
|
||
/// </summary>
|
||
public static Form CreateEditDialog(string title, int width, int height)
|
||
{
|
||
var dlg = new Form
|
||
{
|
||
Text = title,
|
||
Size = new Size(width, height),
|
||
StartPosition = FormStartPosition.CenterParent,
|
||
FormBorderStyle = FormBorderStyle.FixedDialog,
|
||
MaximizeBox = false,
|
||
MinimizeBox = false,
|
||
BackColor = Color.White,
|
||
Font = new Font("微软雅黑", 11F)
|
||
};
|
||
return dlg;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 向弹窗添加确定/取消按钮
|
||
/// </summary>
|
||
public static (Button btnOk, Button btnCancel) AddDialogButtons(Form dlg, ref int y)
|
||
{
|
||
y += 16;
|
||
var btnOk = new Button
|
||
{
|
||
Text = "确 定", BackColor = Color.FromArgb(74, 144, 217), ForeColor = Color.White,
|
||
FlatStyle = FlatStyle.Flat, Size = new Size(120, 36), Location = new Point(80, y),
|
||
DialogResult = DialogResult.OK
|
||
};
|
||
btnOk.FlatAppearance.BorderSize = 0;
|
||
|
||
var btnCancel = new Button
|
||
{
|
||
Text = "取 消", BackColor = Color.FromArgb(229, 231, 235), ForeColor = Color.FromArgb(55, 65, 81),
|
||
FlatStyle = FlatStyle.Flat, Size = new Size(120, 36), Location = new Point(220, y),
|
||
DialogResult = DialogResult.Cancel
|
||
};
|
||
btnCancel.FlatAppearance.BorderSize = 0;
|
||
|
||
dlg.Controls.Add(btnOk);
|
||
dlg.Controls.Add(btnCancel);
|
||
dlg.AcceptButton = btnOk;
|
||
dlg.CancelButton = btnCancel;
|
||
return (btnOk, btnCancel);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 向弹窗添加文本输入字段
|
||
/// </summary>
|
||
public static TextBox AddTextField(Form dlg, string label, ref int y, string value, int labelX = 30, int inputX = 130, int inputWidth = 240, bool isPassword = false)
|
||
{
|
||
dlg.Controls.Add(new Label { Text = label, Location = new Point(labelX, y + 4), AutoSize = true });
|
||
var txt = new TextBox { Text = value ?? "", Location = new Point(inputX, y), Size = new Size(inputWidth, 28), BorderStyle = BorderStyle.FixedSingle };
|
||
if (isPassword) txt.PasswordChar = '*';
|
||
dlg.Controls.Add(txt);
|
||
y += 42;
|
||
return txt;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 向弹窗添加下拉选择字段
|
||
/// </summary>
|
||
public static ComboBox AddComboField(Form dlg, string label, ref int y, string[] items, string selected, int labelX = 30, int inputX = 130, int inputWidth = 240)
|
||
{
|
||
dlg.Controls.Add(new Label { Text = label, Location = new Point(labelX, y + 4), AutoSize = true });
|
||
var cmb = new ComboBox { Location = new Point(inputX, y), Size = new Size(inputWidth, 28), DropDownStyle = ComboBoxStyle.DropDownList };
|
||
cmb.Items.AddRange(items);
|
||
cmb.Text = selected ?? items[0];
|
||
dlg.Controls.Add(cmb);
|
||
y += 42;
|
||
return cmb;
|
||
}
|
||
|
||
// ====================================================================
|
||
// 导出Excel通用方法
|
||
// ====================================================================
|
||
|
||
/// <summary>
|
||
/// 通用的Excel导出流程(弹出保存对话框→查全量数据→NPOI导出→打开文件位置)
|
||
/// </summary>
|
||
/// <param name="sheetName">Excel工作表名称(如"工件管理")</param>
|
||
/// <param name="defaultFileName">默认文件名(如"工件管理",会自动加时间后缀)</param>
|
||
/// <param name="queryAllData">查询全量数据的委托,返回DataTable</param>
|
||
/// <param name="hasData">当前是否有数据可导出</param>
|
||
public static void ExportToExcel(string sheetName, string defaultFileName, Func<DataTable> queryAllData, bool hasData)
|
||
{
|
||
if (!hasData)
|
||
{
|
||
MessageBox.Show("没有数据可导出,请先查询", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||
return;
|
||
}
|
||
using (var sfd = new SaveFileDialog())
|
||
{
|
||
sfd.Filter = "Excel 文件|*.xlsx";
|
||
sfd.FileName = $"{defaultFileName}_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";
|
||
sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
|
||
if (sfd.ShowDialog() == DialogResult.OK)
|
||
{
|
||
try
|
||
{
|
||
DataTable dt = queryAllData();
|
||
if (dt != null && dt.Rows.Count > 0)
|
||
{
|
||
bool exported = NPOITest.ExeclHelper.DataTableToExcel(dt, sheetName, sfd.FileName);
|
||
if (exported)
|
||
{
|
||
MessageBox.Show($"导出成功!共 {dt.Rows.Count} 条记录", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||
System.Diagnostics.Process.Start("explorer.exe", $"/select,\"{sfd.FileName}\"");
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show("导出失败,请检查文件是否被占用", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
MessageBox.Show("查询全量数据失败,请重试", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show($"导出失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|