外观
CodeSnippet-WinForm
winform中,添加控件的顺序影响dock生效的方式,先添加的控件dock方式优先级高>Dock属性不能放在窗体的构造函数中,最好放在Load事件中,否则不起效
Cast 用法
int w = listViewEx.Columns.Cast<ColumnHeader>().Sum(s => s.Width);//表头宽度
Controls c = control.Controls.OfType<Control>().FirstOrDefault();//查找控件圆角
{
int radius = cornerRadius;//圆角大小
using (GraphicsPath path = new GraphicsPath())
{
path.AddArc(0, 0, radius, radius, 180, 90);
path.AddArc(panel.Width - radius, 0, radius, radius, 270, 90);
path.AddArc(panel.Width - radius, panel.Height - radius, radius, radius, 0, 90);
path.AddArc(0, panel.Height - radius, radius, radius, 90, 90);
path.CloseAllFigures();
panel.Region = new Region(path);
}
}渐变色绘制
using (var g = e.Graphics)
{
LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(e.Bounds, ColorTranslator.FromHtml("#ECF5FF"), ColorTranslator.FromHtml("#CADFFF"), LinearGradientMode.Vertical);
g.FillRectangle(myLinearGradientBrush, e.Bounds);//背景色
}效果图

ListBox 添加删除项的按钮
ListBox listBox = new ListBox();
//重绘
listBox.DrawItem += (s, e) =>
{
if (e.Index < 0) return;
e.Graphics.DrawString(listBox.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), e.Bounds);
e.Graphics.DrawString("✕", e.Font, Brushes.Red, new Rectangle(e.Bounds.Right - 20, e.Bounds.Y, 18, e.Bounds.Height), new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
};
//判断点击到删除
listBox.MouseClick += (s, e) =>
{
var lb = s as ListBox;
int index = listBox.IndexFromPoint(e.Location);
if (index >= 0 && e.X >= listBox.GetItemRectangle(index).Right - 20)
{
bool r = credentials.Remove(credentials.Find(t => t.DecUserName == listBox.Items[index].ToString()));
listBox.Items.RemoveAt(index);
SaveCredentials(credentials, filepath);
listBox.Refresh();
}
}
开启 listview 其他项编辑
//开启listview 其他项编辑
//this.View = View.Details;this.FullRowSelect = true;需要开启整行选择
private void ListViewEx_ItemActivate(object sender, EventArgs e)
{
var lv = (ListView)sender;
if (lv.SelectedItems.Count > 0)
{
ListViewItem item = lv.SelectedItems[0];
if (item != null)
{
// 获取选定项的特定子项(例如第二列)
ListViewSubItem subItem = item.SubItems[1];
// 显示子项的文本框,以便用户编辑文本
Rectangle subItemRect = subItem.Bounds;
TextBox subItemEdit = new TextBox();
subItemEdit.Text = subItem.Text;
subItemEdit.Bounds = subItemRect;
subItemEdit.Visible = true;
subItemEdit.LostFocus += (ts, te) =>
{
EditListViewItem((TextBox)ts, subItem);
};
subItemEdit.KeyDown += (ts, te) =>
{
if (te.KeyCode == Keys.Enter)
EditListViewItem((TextBox)ts, subItem);
else if (te.KeyCode == Keys.Escape)
{
subItemEdit.Text = subItem.Text;
subItemEdit.Visible = false;
}
};
lv.Controls.Add(subItemEdit);
subItemEdit.Focus();
}
}
}重绘 ListView
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace DiyControl
{
public partial class ListViewEx : ListView
{
Color borderColor = Color.FromArgb(0, 113, 188);
Color headerColor = ColorTranslator.FromHtml("#212B42");
Color back_headerColor = ColorTranslator.FromHtml("#F0F6FD");
Color o_headerColor = ColorTranslator.FromHtml("#7C828F");
Color bodyColor = ColorTranslator.FromHtml("#4E576A");
Color body_rowColor = ColorTranslator.FromHtml("#F6F6F6");
/// <summary>
/// 表头
/// </summary>
/// <param name="headers">表头数字</param>
public ListViewEx(List<Tuple<string, int, HorizontalAlignment>> headers)
{
InitializeComponent();
this.View = View.Details;
this.OwnerDraw = true;
this.ShowGroups = false;
this.GridLines = false;
this.MultiSelect = false;
this.FullRowSelect = false;
this.DoubleBuffered = false;
this.AllowColumnReorder = false;
this.BorderStyle = BorderStyle.None;
this.Font = new Font("宋体", 13, FontStyle.Bold); //能控制间隔
this.HeaderStyle = ColumnHeaderStyle.Nonclickable;
foreach (var header in headers)
{
this.Columns.Add(header.Item1, header.Item2, header.Item3);
}
}
protected override void OnColumnWidthChanging(ColumnWidthChangingEventArgs e)
{
e.Cancel = true;
e.NewWidth = this.Columns[e.ColumnIndex].Width;
this.EndUpdate();
}
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
e.DrawDefault = false;
using (var g = e.Graphics)
{
g.FillRectangle(new SolidBrush(back_headerColor), e.Bounds);//背景色
using (StringFormat sf = new StringFormat())
{
switch (e.Header.TextAlign)
{
case HorizontalAlignment.Center:
sf.Alignment = StringAlignment.Center;
break;
case HorizontalAlignment.Right:
sf.Alignment = StringAlignment.Far;
break;
}
using (Font headerFont = new Font("宋体", 10f)) //表头
{
var headrow_bounds = e.Bounds;
headrow_bounds.Y = e.Bounds.Y + 5;
if (e.ColumnIndex == 0)
{
g.DrawString(e.Header.Text, new Font("宋体", 11, FontStyle.Bold), new SolidBrush(headerColor), headrow_bounds, sf);
}
else if (e.ColumnIndex == 5) //更多按钮
{
if (e.Header.Tag == null) return;
PictureBox pictureBox = new PictureBox()
{
Tag = e.Header.Tag,
Cursor = Cursors.Hand,
Size = new Size(14, 14),
Image = Image.FromFile("Resources/more1.png"),
Location = new Point(headrow_bounds.X, headrow_bounds.Y),
};
this.Controls.Add(pictureBox);
pictureBox.Click += PictureBox_Click;
}
else
g.DrawString(e.Header.Text, headerFont, new SolidBrush(o_headerColor), headrow_bounds, sf);
}
}
}
}
public delegate void ClickDetailEventHandler(string name);
/// <summary>
/// 点击展示详情事件
/// </summary>
public event ClickDetailEventHandler ClickDetailEvent;
private void PictureBox_Click(object sender, EventArgs e)
{
var pic = sender as PictureBox;
ClickDetailEvent(pic.Tag.ToString());
}
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
TextFormatFlags flags = TextFormatFlags.Left;
var item_bounds = e.Bounds;
item_bounds.Y += 3;
using (var g = e.Graphics)
using (StringFormat sf = new StringFormat())
{
switch (e.Header.TextAlign)
{
case HorizontalAlignment.Center:
sf.Alignment = StringAlignment.Center;
flags = TextFormatFlags.HorizontalCenter;
break;
case HorizontalAlignment.Right:
sf.Alignment = StringAlignment.Far;
flags = TextFormatFlags.Right;
break;
}
if (e.Header.ListView.Name == "listViewTotal")
{
using (Font subItemFont = new Font("宋体", 11))
{
g.DrawString(e.SubItem.Text, subItemFont, new SolidBrush(Color.FromArgb(66, 142, 255)), item_bounds, sf);
}
}
else
{
if (e.Item.Index % 2 == 1)
g.FillRectangle(new SolidBrush(body_rowColor), e.Bounds);
Font subItemFont = new Font("宋体", 10.2f);
if (e.SubItem.Text.Length > 15) subItemFont = new Font("宋体", 9);
if (e.ColumnIndex == 4 && e.SubItem.Text.IndexOfAny(new char[] { '+', '↑' }) > -1)
g.DrawString(e.SubItem.Text, subItemFont, new SolidBrush(Color.Red), item_bounds, sf);
else
g.DrawString(e.SubItem.Text, subItemFont, new SolidBrush(bodyColor), item_bounds, sf);
}
}
}
}
}效果图 
重绘 tabControl
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DiyControl
{
public partial class TabControlEXDetail : TabControl
{
SolidBrush blackBrush = new SolidBrush(Color.Black);
SolidBrush whiteBrush = new SolidBrush(Color.White);
SolidBrush checkBrush = new SolidBrush(Color.FromArgb(66, 142, 255));
float fontsize = 11f;
public TabControlEXDetail()
{
InitializeComponent();
base.SetStyle(
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw |
ControlStyles.SupportsTransparentBackColor, true);
base.UpdateStyles();
this.DrawMode = TabDrawMode.OwnerDrawFixed;
//this.SizeMode = TabSizeMode.Fixed; // 大小模式为固定
//this.ItemSize = new Size(200, 30); // 设定每个标签的尺寸
}
protected override void OnPaint(PaintEventArgs e)
{
try
{
var g = e.Graphics;
Rectangle allrect = e.ClipRectangle;
allrect = new Rectangle(e.ClipRectangle.X - 1, e.ClipRectangle.Y - 1, e.ClipRectangle.Width + 2, e.ClipRectangle.Height + 2);
g.FillRectangle(whiteBrush, allrect);
int lastTabIndex = this.TabCount - 1;
TabPage lastTab = new TabPage();
var tabrect = this.GetTabRect(lastTabIndex > 0 ? lastTabIndex : 1);
Rectangle rect = new Rectangle(tabrect.X + tabrect.Width, 2, Width, ItemSize.Height);
g.FillRectangle(whiteBrush, rect); //填充标签空白处
//g.DrawImage(Image.FromFile("Resources/close.png"), Width - 100, 5);
for (int i = 0; i < this.TabCount; i++)
{
var _tab = this.TabPages[i];
Rectangle bounds = this.GetTabRect(i);
g.FillRectangle(Brushes.White, bounds);
using (StringFormat sf = new StringFormat())
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
if (this.SelectedIndex == i)
{
g.DrawString(_tab.Text, new Font("微软雅黑", fontsize), checkBrush, bounds, sf);
g.FillRectangle(checkBrush, bounds.X + 15, bounds.Height - 5, bounds.Width - 30, 2); //选中项下划线
}
else
{
g.DrawString(_tab.Text, new Font("微软雅黑", fontsize), blackBrush, bounds, sf);
}
}
}
}
catch (Exception ex) { }
}
}
}效果图

MainMenuStrip 菜单动态添加
void LoadSetMenuItem()
{
MainMenuStrip.Items.Clear();
ToolStripMenuItem MenuItem;
MenuItem = AddMenuItem("用户管理", MainMenuStrip.Items);
MenuItem = AddMenuItem("样本信息设置", MainMenuStrip.Items);
AddMenuItem("样本基础信息设置", MenuItem.DropDownItems);
AddMenuItem("样本信息值设置", MenuItem.DropDownItems);
MenuItem = AddMenuItem("检测项设置", MainMenuStrip.Items);
AddMenuItem("检测项目组管理", MenuItem.DropDownItems);
AddMenuItem("检测项管理", MenuItem.DropDownItems);
AddMenuItem("检测项值管理", MenuItem.DropDownItems);
AddMenuItem("检测项结果等级管理", MenuItem.DropDownItems);
MenuItem = AddMenuItem("医生分析设置", MainMenuStrip.Items);
AddMenuItem("医生分析内容管理", MenuItem.DropDownItems);
AddMenuItem("医生分析条件管理", MenuItem.DropDownItems);
MenuItem = AddMenuItem("报告设置", MainMenuStrip.Items);
AddMenuItem("报告设置", MenuItem.DropDownItems);
AddMenuItem("报告设计", MenuItem.DropDownItems);
MenuItem = AddMenuItem("耗材管理", MainMenuStrip.Items);
AddMenuItem("耗材管理", MenuItem.DropDownItems);
AddMenuItem("耗材使用记录", MenuItem.DropDownItems);
AddMenuItem("耗材生产管理", MenuItem.DropDownItems);
AddMenuItem("耗材类型管理", MenuItem.DropDownItems);
AddMenuItem("渠道管理", MainMenuStrip.Items);
AddMenuItem("综合设置", MainMenuStrip.Items);
AddMenuItem("出厂设置", MainMenuStrip.Items);
AddMenuItem("数据备份", MainMenuStrip.Items);
AddMenuItem("日志", MainMenuStrip.Items);
AddMenuItem("关于", MainMenuStrip.Items);
}
public ToolStripMenuItem AddMenuItem(string text, ToolStripItemCollection parentItem)
{
ToolStripMenuItem subMenuItem = new ToolStripMenuItem(text);
subMenuItem.Click += SubMenuItem_Click;
parentItem.Add(subMenuItem);
return subMenuItem;
}
private void SubMenuItem_Click(object sender, EventArgs e)
{
var ClickItem = (ToolStripMenuItem)sender;
switch (ClickItem.Text)
{
case "用户管理":break;
default: break;
}
}效果图

datagridview 基础设置
//右边固定行,添加操作按钮图片
public void CreateHeader()
{
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AutoGenerateColumns = false;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.AllowUserToResizeColumns = false;
dataGridView1.RowHeadersVisible = false;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.BackgroundColor = Color.White;
dataGridView1.BorderStyle = BorderStyle.None;
dataGridView1.EnableHeadersVisualStyles = false;
dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
dataGridView1.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //表头高度设置为不可更改
dataGridView1.ColumnHeadersHeight = 40; //表头高度
dataGridView1.RowTemplate.Height = 35; //内容行高度
dataGridView1.RowsDefaultCellStyle.BackColor = Color.White;// 内容背景色;
dataGridView1.DefaultCellStyle.SelectionBackColor = Color.FromArgb(66, 142, 255);// 选中行背景色
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = SysParam.pageBackColor; // 奇数行背景色
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(240, 246, 253);//pageBackColor;// 标题栏背景/前景色
dataGridView1.RowHeadersDefaultCellStyle.SelectionBackColor = Color.FromArgb(66, 142, 255);// 行头 选中行背景色
dataGridView1.ColumnHeadersDefaultCellStyle.SelectionBackColor = dataGridView1.ColumnHeadersDefaultCellStyle.BackColor;// Color.Transparent; // 选中列背景色
dataGridView1.ReadOnly = true;
dataGridView1.CellContentClick += DataGridView1_CellContentClick;
CreateCol("作", "Del", 25, "image", image: Properties.Resources.del);
CreateCol("", "Edit", 25, "image", image: Properties.Resources.edit);
CreateCol("操", "Add", 25, "image", image: Properties.Resources.dgadd);
CreateCol("启用", "isEnabled", 60, "checkbox");
CreateCol("预分类编号", "recogCode", 100);
CreateCol("预分类项目", "isRecog", 100, "checkbox");
CreateCol("单位", "unit", 60);
CreateCol("女性最小值", "girlMin", 100);
CreateCol("女性最大值", "girlMax", 100);
CreateCol("男性最小值", "manMin", 100);
CreateCol("男性最大值", "manMax", 100);
CreateCol("区分性别", "isValueSex", 80, "checkbox");
CreateCol("默认值", "defaulted", 80);
CreateCol("值为数字", "isNum", 80, "checkbox");
CreateCol("控件类型", "controlTypeStr", 90);
CreateCol("项目分类", "itemsName", 150);
CreateCol("检测项名称", "itemName", 200);
CreateCol("检测项编码", "itemCode", 200);
CreateCol("序号", "id", 60);
dataGridView1.Columns[0].Frozen = true;
dataGridView1.Columns[1].Frozen = true;
dataGridView1.Columns[2].Frozen = true;
dataGridView1.RightToLeft = RightToLeft.Yes;
dataGridView1.HorizontalScrollingOffset = dataGridView1.Width;//滚动条
}
/// <summary>
/// 创建表头
/// </summary>
/// <param name="HeaderText">列名称</param>
/// <param name="PropertyName">列字段名</param>
/// <param name="width">列宽度</param>
/// <param name="type">列类型</param>
/// <param name="visible">是否显示该列</param>
/// <param name="HeaderFont">表头字体</param>
/// <param name="DefaultFont">内容字体</param>
public void CreateCol(string HeaderText, string PropertyName, int width, string type = "text", bool visible = true, Font HeaderFont = null, Font DefaultFont = null, Image image = null)
{
if (HeaderFont == null) HeaderFont = new Font("宋体", 10, FontStyle.Bold);
if (DefaultFont == null) DefaultFont = new Font("宋体", 10);
DataGridViewColumn dataGridViewColumn = new DataGridViewTextBoxColumn();
switch (type)
{
case "text":
dataGridViewColumn = new DataGridViewTextBoxColumn();
break;
case "checkbox":
dataGridViewColumn = new DataGridViewCheckBoxColumn();
break;
case "image":
dataGridViewColumn = new DataGridViewImageColumn();
((DataGridViewImageColumn)dataGridViewColumn).Image = image;
break;
default: break;
}
dataGridViewColumn.HeaderText = HeaderText;
dataGridViewColumn.Name = PropertyName;
dataGridViewColumn.DataPropertyName = PropertyName;
dataGridViewColumn.Width = width;
dataGridViewColumn.FillWeight = width;
dataGridViewColumn.HeaderCell.Style.Font = HeaderFont;
dataGridViewColumn.DefaultCellStyle.Font = DefaultFont;
dataGridViewColumn.Visible = visible;
dataGridView1.Columns.Add(dataGridViewColumn);
}
private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
CurrentRow = null;
string cellname = dataGridView1.Columns[e.ColumnIndex].Name;
if (dataGridView1.SelectedRows.Count <= 0) return;
SelctRowsToModel();
switch (cellname)
{
case "Add": break;
case "Edit": break;
case "Del": break;
default: break;
}效果图

蒙版模态弹窗
public partial class MsgFrm : Form
{
public static MsgFrm msg = null;
public MsgFrm()
{
InitializeComponent();
this.ControlBox = false;
this.ShowInTaskbar = false;
this.FormBorderStyle = FormBorderStyle.None;
this.StartPosition = FormStartPosition.CenterParent;
this.BackColor = Color.White;
this.Paint += MsgFrm_Paint;
}
private void MsgFrm_Paint(object sender, PaintEventArgs e)
{
using (GraphicsPath path = new GraphicsPath())
{
int radius = 3;
Rectangle rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
path.AddArc(rect.X + rect.Width - radius * 2, rect.Y, radius * 2, radius * 2, 270, 90);
path.AddArc(rect.X + rect.Width - radius * 2, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
path.AddArc(rect.X, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
this.Region = new Region(path);
}
}
public static MsgFrm Instance()
{
if (msg == null)
msg = new MsgFrm();
return msg;
}
public DialogResult Show(string content)
{
MsgBox.Instance().Show(Frm_Form1.Frm_Form);
btn_sure.Visible = false;
btn_cancel.Visible = false;
btn_know.Visible = true;
DialogResult result = DialogResult.Cancel;
if (content == string.Empty)
{
return result;
}
lab_showInfo.Text = content;
result = this.ShowDialog();
return result;
}
public DialogResult Confrim(string content)
{
MsgBox.Instance().Show(Frm_Form1.Frm_Form);
btn_sure.Visible = true;
btn_cancel.Visible = true;
btn_know.Visible = false;
DialogResult result = DialogResult.Cancel;
if (content == string.Empty)
{
return result;
}
lab_showInfo.Text = content;
result = this.ShowDialog();
return result;
}
#region MyRegion
/// <summary>
/// 取消
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_cancel_Click(object sender, EventArgs e)
{
MsgBox.Instance().Hide();
this.DialogResult = DialogResult.Cancel;
}
/// <summary>
/// 确定
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_sure_Click(object sender, EventArgs e)
{
MsgBox.Instance().Hide();
this.DialogResult = DialogResult.OK;
}
private void label1_Click(object sender, EventArgs e)
{
MsgBox.Instance().Hide();
this.Close();
}
#endregion
}
/// <summary>
/// 蒙版
/// </summary>
public class MsgBox : Form
{
public static MsgBox msg = new MsgBox();
public MsgBox()
{
this.Opacity = 0.5;
this.BackColor = Color.DarkGray;
this.Dock = DockStyle.Fill;
this.FormBorderStyle = FormBorderStyle.None;
this.ShowInTaskbar = false;
this.TopLevel = true;
Rectangle workingArea = Screen.GetWorkingArea(this);
this.Bounds = new Rectangle(workingArea.Left, workingArea.Top, workingArea.Width, workingArea.Height);
}
public static MsgBox Instance()
{
if (msg == null)
msg = new MsgBox();
return msg;
}
//public static MsgBox Instance { get => msg == null ? new MsgBox() : msg; }
}效果图

TreeView 重绘
- [[TreeView重绘]]
透明 Panel
public partial class PanelOpacity : Panel
{
public PanelOpacity()
{
SetStyle(ControlStyles.Opaque, true);
}
private int opacity = 50;
[Description("透明度0-100"),DefaultValue(50)]
public int Opacity
{
get
{
return this.opacity;
}
set
{
if (value < 0 || value > 100)
throw new ArgumentException("值范围 0 - 100");
this.opacity = value;
}
}
private const int WS_EX_TRANSPARENT = 0x20;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
}
}