WinFormTools/WinformDevFramework/System/FrmMenu.cs

456 lines
19 KiB
C#

using SqlSugar;
using System.Windows.Forms;
using Sunny.UI;
using WinformDevFramework.Core.Configuration;
using WinformDevFramework.Core.Winform;
using WinformDevFramework.IServices.System;
using WinformDevFramework.Models;
using static Npgsql.Replication.PgOutput.Messages.RelationMessage;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace WinformDevFramework
{
public partial class FrmMenu : BaseForm1
{
private ISysMenuServices _sysMenuServices;
public FrmMenu(ISysMenuServices sysMenuServices)
{
_sysMenuServices = sysMenuServices;
InitializeComponent();
this.DoubleBuffered=true;
}
/// <summary>
/// 初始化数据
/// </summary>
public override void Init()
{
base.Init();
dataGridViewList.DoubleBuffered();
ltMenuTitle.Label.Text = "菜单名称";
ltIcon.Label.Text = "菜单图标";
ltMenuUrl.Label.Text = "菜单Url";
ltSort.Label.Text = "排序";
ltCreateBy.Label.Text = "创建人";
ltUpdateBy.Label.Text = "修改人";
lcMenuType.Label.Text = "菜单类型";
ldCreateDate.Label.Text = "创建时间";
ldUpdateDate.Label.Text = "修改时间";
ltIcon.TextBox.TextChanged += TextBox_TextChanged;
dataGridViewList.CellFormatting += DataGridViewList_CellFormatting;
uiComboTreeViewPMenu.CanSelectRootNode=true;
//初始化父菜单数据
var menus = GetAllMenus();
SetParentMenu(menus);
//初始化菜单类型
this.lcMenuType.ComboBox.DataSource = new List<string>(){"Button","Form","Menu"};
//初始化 数据列表 列名称
this.dataGridViewList.DataSource=menus.OrderBy(p=>p.PermissionCode).ToList();
this.dataGridViewList.Columns["ID"]!.HeaderText = "ID";
this.dataGridViewList.Columns["PMenuName"]!.HeaderText = "父菜单";
this.dataGridViewList.Columns["PMenuName"].DisplayIndex=1;
this.dataGridViewList.Columns["Title"]!.HeaderText = "菜单名称";
this.dataGridViewList.Columns["Title"].DisplayIndex = 2;
this.dataGridViewList.Columns["MenuCode"]!.HeaderText = "菜单编码";
this.dataGridViewList.Columns["PermissionCode"]!.HeaderText = "菜单权限标识";
this.dataGridViewList.Columns["Icon"]!.HeaderText = "图标";
this.dataGridViewList.Columns["Icon"].Visible = false;
this.dataGridViewList.Columns["Url"]!.HeaderText = "菜单URL";
this.dataGridViewList.Columns["SortOrder"]!.HeaderText = "排序";
this.dataGridViewList.Columns["MenuType"]!.HeaderText = "菜单类型";
this.dataGridViewList.Columns["CreateByName"]!.HeaderText = "创建人";
this.dataGridViewList.Columns["CreatedDate"]!.HeaderText = "创建时间";
this.dataGridViewList.Columns["UpdateByName"]!.HeaderText = "修改人";
this.dataGridViewList.Columns["UpdatedDate"]!.HeaderText = "修改时间";
this.dataGridViewList.Columns["ParentID"].Visible = false;
this.dataGridViewList.Columns["CreatedBy"].Visible = false;
this.dataGridViewList.Columns["UpdatedBy"].Visible = false;
DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
imageColumn.HeaderText = "图标";
imageColumn.Name = "ImageColumn";
imageColumn.DefaultCellStyle.NullValue = null;
this.dataGridViewList.Columns.Add(imageColumn);
SetToolButtonStatus(formStatus);
SetToolsButton();
}
private void DataGridViewList_CellFormatting(object? sender, DataGridViewCellFormattingEventArgs e)
{
if (e.RowIndex >= 0 && dataGridViewList.Columns[e.ColumnIndex] is DataGridViewImageColumn)
{
// 获取当前行的数据
var rowData = dataGridViewList.Rows[e.RowIndex].DataBoundItem as sysMenu;
// 根据行的数据设置图片
if (rowData != null)
{
// 根据需要设置图片的逻辑
// 这里假设你有一个名为"ImageFilePath"的属性,表示图片的文件路径
string imageFilePath =Application.StartupPath+"\\"+ rowData.Icon;
// 设置单元格的图片
if (!string.IsNullOrEmpty(imageFilePath)&&File.Exists(imageFilePath))
{
e.Value = Image.FromFile(imageFilePath);
}
}
}
}
private void TextBox_TextChanged(object? sender, EventArgs e)
{
if (string.IsNullOrEmpty(ltIcon.TextBox.Text))
{
pictureBox.Image = null;
}
else
{
if(File.Exists(Application.StartupPath + "\\" + ltIcon.TextBox.Text))
pictureBox.Image = Image.FromFile(Application.StartupPath+"\\"+ltIcon.TextBox.Text);
}
}
/// <summary>
/// 父菜单控件设置
/// </summary>
private void SetParentMenu(List<sysMenu> menus)
{
uiComboTreeViewPMenu.Nodes.Clear();
List<TreeNode> nodes = new List<TreeNode>();
foreach (var menu in menus)
{
TreeNode node = new TreeNode(menu.Title);
node.Tag = menu;
node.Name = menu.ID.ToString();
nodes.Add(node);
}
foreach (var treeNode in nodes)
{
var menu = (sysMenu)treeNode.Tag;
treeNode.Nodes.AddRange(nodes.Where(p => menu.ID == ((sysMenu)p.Tag).ParentID).ToArray());
}
uiComboTreeViewPMenu.Nodes.Add(nodes.Where(p => ((sysMenu)p.Tag).ParentID == 0).FirstOrDefault());
}
/// <summary>
/// 获取所有菜单项
/// </summary>
/// <returns></returns>
private List<sysMenu> GetAllMenus()
{
var menus = _sysMenuServices.QueryMuch<sysMenu, sysMenu, sysUser, sysUser, sysMenu>((m, pm, u1, u2) => new object[]
{
JoinType.Left,m.ParentID==pm.ID,
JoinType.Left,m.CreatedBy==u1.ID,
JoinType.Left,m.UpdatedBy==u2.ID,
},
(m, pm, u1, u2) => new sysMenu()
{
ID = m.ID,
CreatedBy = m.CreatedBy,
UpdatedBy = m.UpdatedBy,
ParentID = m.ParentID,
Title = m.Title,
Icon = m.Icon,
PMenuName = pm.Title,
CreateByName = u1.Fullname,
CreatedDate = m.CreatedDate,
MenuType = m.MenuType,
UpdatedDate = m.UpdatedDate,
UpdateByName = u2.Fullname,
SortOrder = m.SortOrder,
URL = m.URL,
MenuCode = m.MenuCode,
PermissionCode = m.PermissionCode,
}
);
return menus;
}
public override void TabControlSelectingFunction(object? sender, TabControlCancelEventArgs e)
{
base.TabControlSelectingFunction(sender, e);
}
public override void DataGridViewListDoubleClick(object? sender, DataGridViewCellEventArgs e)
{
base.DataGridViewListDoubleClick(sender, e);
var g = (DataGridView)sender;
var model=g.CurrentRow.DataBoundItem as sysMenu;
//给详情页设置数据
this.txtID.Text = model.ID.ToString();
this.ltMenuTitle.TextBox.Text = model.Title;
this.ltMenuUrl.TextBox.Text = model.URL;
this.ltSort.TextBox.Text = model.SortOrder.ToString();
this.lcMenuType.ComboBox.Text = model.MenuType;
this.ltIcon.TextBox.Text=model.Icon;
this.ltCreateBy.TextBox.Text = model.CreateByName;
this.ldCreateDate.DateTimePicker.Text=model.CreatedDate.ToString();
this.ltUpdateBy.TextBox.Text = model.UpdateByName;
this.ldUpdateDate.DateTimePicker.Text = model.UpdatedDate.ToString();
txtMenuCode.Text=model.MenuCode;
txtPermissionCode.Text =model.PermissionCode;
var pmenu = _sysMenuServices.QueryById(model.ParentID);
if (pmenu != null)
{
TreeNode node = new TreeNode(pmenu.Title);
node.Name = pmenu.ID.ToString();
node.Tag = pmenu;
this.uiComboTreeViewPMenu.TreeView.SelectedNode = this.uiComboTreeViewPMenu.TreeView.Nodes.Find(pmenu.ID.ToString(),true).FirstOrDefault();
this.uiComboTreeViewPMenu.Text = pmenu.Title;
this.uiComboTreeViewPMenu.Tag = pmenu.ID;
}
SetToolButtonStatus(formStatus);
}
public override void AddFunction(object sender, EventArgs e)
{
base.AddFunction(sender, e);
SetToolButtonStatus(formStatus);
ltCreateBy.TextBox.Text = AppInfo.User.Fullname;
ldCreateDate.DateTimePicker.Text= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ltSort.TextBox.Text = "1";
}
/// <summary>
/// 设置功能按钮状态
/// </summary>
public override void SetToolButtonStatus(FormStatus status)
{
switch (status)
{
case FormStatus.Add:
{
btnAdd.Enabled = false;
btnEdit.Enabled = false;
btnSave.Enabled = true;
btnDel.Enabled = false;
btnCanel.Enabled = true;
SetControlStatus(this.groupBox1,true);
ClearControlsText(this.groupBox1);
break;
}
case FormStatus.Edit:
{
btnAdd.Enabled = false;
btnEdit.Enabled = false;
btnSave.Enabled = true;
btnDel.Enabled = false;
btnCanel.Enabled = true;
SetControlStatus(this.groupBox1, true);
break;
}
case FormStatus.View:
{
btnAdd.Enabled = true;
btnEdit.Enabled = true;
btnSave.Enabled = false;
btnDel.Enabled = true;
btnCanel.Enabled = false;
SetControlStatus(this.groupBox1,false);
break;
}
case FormStatus.Canel:
{
btnAdd.Enabled = true;
btnEdit.Enabled = true;
btnSave.Enabled = false;
btnDel.Enabled = false;
btnCanel.Enabled = false;
SetControlStatus(this.groupBox1, false);
break;
}
case FormStatus.First:
{
btnAdd.Enabled = true;
btnEdit.Enabled = false;
btnSave.Enabled = false;
btnDel.Enabled = false;
btnCanel.Enabled=false;
SetControlStatus(this.groupBox1, false);
break;
}
case FormStatus.Save:
{
btnAdd.Enabled = true;
btnEdit.Enabled = true;
btnSave.Enabled = false;
btnDel.Enabled = true;
btnCanel.Enabled = false;
SetControlStatus(this.groupBox1, false);
break;
}
case FormStatus.Del:
{
btnAdd.Enabled = true;
btnEdit.Enabled = false;
btnSave.Enabled = false;
btnDel.Enabled = false;
btnCanel.Enabled = false;
SetControlStatus(this.groupBox1, false);
ClearControlsText(this.groupBox1);
break;
}
}
}
public override void EditFunction(object sender, EventArgs e)
{
base.EditFunction(sender, e);
SetToolButtonStatus(formStatus);
ltUpdateBy.TextBox.Text = AppInfo.User.Fullname;
ldUpdateDate.DateTimePicker.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
public override void SaveFunction(object sender, EventArgs e)
{
base.SaveFunction(sender, e);
if (ValidateData())
{
//新增
if (string.IsNullOrEmpty(txtID.Text))
{
sysMenu newMenu = new sysMenu();
newMenu.CreatedBy = AppInfo.User.ID;
newMenu.CreatedDate = DateTime.Parse(ldCreateDate.DateTimePicker.Text);
newMenu.Title = ltMenuTitle.TextBox.Text;
newMenu.URL = ltMenuUrl.TextBox.Text;
if (uiComboTreeViewPMenu.TreeView.SelectedNode == null)
{
newMenu.ParentID = int.Parse(uiComboTreeViewPMenu.Tag.ToString());
}
else
{
newMenu.ParentID = ((sysMenu)uiComboTreeViewPMenu.TreeView.SelectedNode.Tag).ID;
}
newMenu.SortOrder = Int32.Parse(ltSort.TextBox.Text);
newMenu.MenuType = lcMenuType.ComboBox.Text;
newMenu.Icon = ltIcon.TextBox.Text;
newMenu.MenuCode=txtMenuCode.Text;
newMenu.PermissionCode=txtPermissionCode.Text;
var id = _sysMenuServices.Insert(newMenu);
txtID.Text = id.ToString();
if (id > 0)
{
MessageBox.Show("保存成功!", "提示");
}
}
// 修改
else
{
sysMenu newMenu = _sysMenuServices.QueryById(int.Parse(txtID.Text));
newMenu.UpdatedBy = AppInfo.User.ID;
newMenu.UpdatedDate = DateTime.Parse(ldCreateDate.DateTimePicker.Text);
newMenu.Title = ltMenuTitle.TextBox.Text;
newMenu.URL = ltMenuUrl.TextBox.Text;
if (uiComboTreeViewPMenu.TreeView.SelectedNode == null)
{
newMenu.ParentID = int.Parse(uiComboTreeViewPMenu.Tag.ToString());
}
else
{
newMenu.ParentID = ((sysMenu)uiComboTreeViewPMenu.TreeView.SelectedNode.Tag).ID;
}
newMenu.SortOrder = Int32.Parse(ltSort.TextBox.Text);
newMenu.MenuType = lcMenuType.ComboBox.Text;
newMenu.Icon = ltIcon.TextBox.Text;
newMenu.MenuCode = txtMenuCode.Text;
newMenu.PermissionCode = txtPermissionCode.Text;
if (_sysMenuServices.Update(newMenu))
{
MessageBox.Show("保存成功!", "提示");
}
}
SetToolButtonStatus(formStatus);
var menus = GetAllMenus();
this.dataGridViewList.DataSource = menus.OrderBy(p => p.PermissionCode).ToList();
SetParentMenu(menus);
}
}
public override void DelFunction(object sender, EventArgs e)
{
base.DelFunction(sender, e);
var result = MessageBox.Show("是否删除?", "确认", MessageBoxButtons.YesNoCancel);
if (result == DialogResult.Yes)
{
_sysMenuServices.DeleteById(Int32.Parse(txtID.Text));
formStatus = FormStatus.Del;
SetToolButtonStatus(formStatus);
var menus = GetAllMenus();
this.dataGridViewList.DataSource = menus.OrderBy(p => p.PermissionCode).ToList();
SetParentMenu(menus);
}
}
public override void CanelFunction(object sender, EventArgs e)
{
bool isAdd = formStatus == FormStatus.Add;
base.CanelFunction(sender, e);
SetToolButtonStatus(formStatus);
if (isAdd) btnEdit.Enabled = false;
}
//验证数据
private bool ValidateData()
{
bool result=false;
if (string.IsNullOrEmpty(ltMenuTitle.TextBox.Text))
{
MessageBox.Show("菜单名称不能为空!");
return result;
}
if (!lcMenuType.ComboBox.Text.Equals("Menu")&&string.IsNullOrEmpty(uiComboTreeViewPMenu.Text))
{
MessageBox.Show("父菜单不能为空!");
return result;
}
if (lcMenuType.ComboBox.Text.Equals("Form") && (string.IsNullOrEmpty(ltMenuUrl.TextBox.Text)))
{
MessageBox.Show("菜单图标不能为空!");
return result;
}
if (string.IsNullOrEmpty(txtMenuCode.Text))
{
MessageBox.Show("菜单编码不能为空!");
return result;
}
if (string.IsNullOrEmpty(txtPermissionCode.Text))
{
MessageBox.Show("权限标识不能为空!");
return result;
}
result = true;
return result;
}
/// <summary>
/// 选择图标
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelectIcon_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = Application.StartupPath + "Resources\\";
openFileDialog.Filter = "Image Files (*.jpg, *.png, *.gif, *.bmp)|*.jpg; *.png; *.gif; *.bmp";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string selectedImagePath = openFileDialog.FileName.Replace(Application.StartupPath,"");
ltIcon.TextBox.Text= selectedImagePath;
}
}
}
}