WinForm
文章平均质量分 66
GreAmbWang
博客是我的笔记本,Blink是我的朋友圈,论坛是我的老师
展开
-
WinForm拖拽控件,运行时模仿窗体设计调整控件大小和位置,上传GitHub了,也上传到NuGet
最近,有几个小伙伴私信我关于WinForm的问题,关于拖拽控件,就像在窗体设计时调整控件大小和位置一样https://greambwang.blog.csdn.net/article/details/90639601源码:https://github.com/GreAmbWang/WinFormProjects...原创 2021-07-03 13:55:44 · 3233 阅读 · 12 评论 -
【WinForm】DataGridView重绘,选择行添加边框
为DataGridView的RowPostPaint绑定事件RowPostPaint += DataGridView_RowPostPaintprivate void ZyDataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e){ if (Rows[e.RowIndex].Selected) { //绘制选中行边框 using (Pen pen = new原创 2021-03-11 19:37:52 · 1508 阅读 · 1 评论 -
【WinForm】线程安全方式,通用方法SetControlSafe
通用方法public static partial class CtrlHelper{ public static void SetControlSafe<T>(T control, Action action) where T : Control { if (control.InvokeRequired) { while (!((T)control).IsHandleCreated) {原创 2020-10-24 00:18:40 · 272 阅读 · 0 评论 -
【WinForm】Error creating window handle.创建窗口句柄时出错
问题:先后出现两个错误Error creating window handle.创建窗口句柄时出错。当前程序已使用了 Window 管理器对象的系统允许的所有句柄分析:在更新数据时,会清除旧数据包含用户控件,然后重新创建控件显示数据清除控件的代码为panel.Controls.Clear();直接移除控件,而没有释放资源而Windows对单个程序的句柄限制为1W。导致程序句柄不足,从而导致创建窗口句柄时出错解决:移除控件前,先释放资源//释放资源..原创 2020-07-18 21:28:35 · 1581 阅读 · 1 评论 -
【WinForm】在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级。
问题:报错信息:System.ArgumentException: 在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级。 在 System.Windows.Forms.Control.ControlCollection.Add(Control value)解决:原代码panel.Controls.Add(slides);修改后的if (pane...原创 2019-10-25 10:46:30 · 2090 阅读 · 2 评论 -
【WinForm】调整控件大小和位置时限制位置,包含鼠标光标移动区域
调整控件大小和位置时限制位置就是移动控件和调整控件大小时,将控件限制在一定区域里面,这里限制区域为panel里面移动控件源码看这里运行时模仿窗体设计调整控件大小和位置实现效果:1.控件移动区域只能在panel里面移动2.在移动控件时,鼠标光标移动区域为panel,停止移动时鼠标光标移动区域为整个屏幕这个需要设置Cursor.Clip属性停止移动...原创 2019-10-14 16:27:13 · 1291 阅读 · 0 评论 -
【WinForm】对话框:选择文件OpenFileDialog,保存文件SaveFileDialog,选择文件夹FolderBrowserDialog
选择文件OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);openFileDialog.Filter = "文本文件(*.txt)|*.txt...原创 2019-06-03 17:37:49 · 1958 阅读 · 0 评论 -
【WinForm】下拉框ComboBox绑定数据
下拉框绑定数据绑定list实体集直接绑定cmb.DataSource = list;cmb.ValueMember = "ID";cmb.DisplayMember = "Name";也可以通过BindingSource来绑定cmb.DataSource = new BindingSource() { DataSource = list };cmb.ValueMemb...原创 2019-06-21 22:41:50 · 2742 阅读 · 0 评论 -
【WinForm】下拉框ComboBox绘制颜色选项
效果:首先,需要将绘制模式设置为手动绘制,绑定绘制方法,添加颜色//设置手动绘制cmb.DrawMode = DrawMode.OwnerDrawFixed;cmb.DropDownStyle = ComboBoxStyle.DropDownList;cmb.DrawItem += cmb_DrawItem;cmb.Items.Add(Color.Red);cmb.Ite...原创 2019-06-21 23:04:08 · 5705 阅读 · 1 评论 -
【WinForm】ListBox显示最后一行
选择和显示最后一行lsbLog.SelectedIndex = lsbLog.Items.Count - 1;lsbLog.TopIndex = lsbLog.Items.Count - 1;原创 2019-06-21 23:39:31 · 3910 阅读 · 0 评论 -
【WinForm】通过控件名称获取控件
Control[] ctrls = Controls.Find("btnOK", true);public Control[] Find(string key, bool searchAllChildren);key 控件的名称searchAllChildren 是否搜索所有子控件原创 2019-06-29 01:35:55 · 4193 阅读 · 1 评论 -
【WinForm】全局异常捕获
全局捕获异常写在Program.cs文件中在Main方法的开头static class Program{ /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //设置未经处理的异常处理模式 ...原创 2019-06-29 14:07:43 · 655 阅读 · 0 评论 -
【WinForm】Timer开始无效
问题:timer.Start();无效原因分析:查了相关资料发现,原来System.Windows.Forms.Timer需要在UI线程中执行,之前为了操作不卡顿,加了异步操作,导致不执行解决方法:在UI线程上执行,只要是在创建UI线程上创建的控件对象都可以,我这里的lbCntTime是UI线程创建的Label控件,为了显示计时lbCntTime.Invoke...原创 2019-07-18 11:44:21 · 1641 阅读 · 0 评论 -
【WinForm】模仿电脑IP控件 用户控件 源码
可以实现的效果看看电脑IP输入框的一些功能只能输入数字 当输入一位后自动跳转到下一位 IP地址和默认网关的第一位范围为1到233,其它都是0到255 当不符合要求时,会弹框提示,例如“555不是有效项。请指定一个介于1和233间的值。”电脑IP输入框首先,新建用户控件UserControl ,命名UCIP新建一个IPAddress类,来存放IP地...原创 2019-07-25 21:10:39 · 1104 阅读 · 2 评论 -
【WinForm】加载等待界面Loading
首先定义一个加载界面接口,在加载界面可以实现该接口/// <summary>/// 加载界面接口/// </summary>public interface ILoad{ /// <summary> /// 设置加载状态 /// </summary> void SetState(string state)...原创 2019-08-07 11:18:33 · 5884 阅读 · 6 评论 -
【WinForm】设置FormBorderStyle为None后点击任务栏自动最小化
[DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]public static extern int GetWindowLong(HandleRef hWnd, int nIndex);[DllImport("user32.dll", EntryPoint = "SetWindo...原创 2019-08-12 20:25:39 · 832 阅读 · 0 评论 -
【 WinForm】全屏截图,控件截图,句柄截图
代码#region 全屏截图private Bitmap ScreenshotFull(){ Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); Graphics g = Graphics.FromImage(bmp); g...原创 2019-09-23 19:21:20 · 1897 阅读 · 0 评论 -
【WinForm】加载界面闪屏解决方法
当窗体有多个控件时,加载时会出现,一些控件加载好了显示出来了,但是有些控件还没加载好这样的情况:解决方法1:加载过程中只出现背景,等控件加载好一次性出现protected override CreateParams CreateParams{ get { var parms = base.CreateParams; pa...原创 2019-06-01 00:39:36 · 1914 阅读 · 1 评论 -
【WinForm】打印机编辑打印内容并实现双排打印
本次使用的打印机是Gprinter GP-9134T实现打印的主要代码就是PrintDocument printDocument = new PrintDocument();//设置边距printDocument.PrinterSettings.DefaultPageSettings.Margins = new Margins(0,0,0,0);//纸张大小printDoc...原创 2019-05-29 09:57:33 · 1886 阅读 · 0 评论 -
【WinForm】实现异步
public IAsyncResult RunAsyncBeginInvoke(Action action){ return ((Action)delegate () { BeginInvoke((Action)delegate () { action.Invoke(); }); }).Beg...原创 2019-05-28 17:38:52 · 2369 阅读 · 0 评论 -
【WinForm】DataGridView设置显示行数
DataGridView设置显示行数当dgv行数与数据列表行数不同时,相应的增加或减少行数如果使用dgv.Rows.Clear();dgv.Rows.Add();,每次刷新数据都要进行清除行再添加行,影响性能和用户体验方法/// <summary>/// DataGridView设置显示行数/// </summary>...原创 2019-04-13 11:38:28 · 10204 阅读 · 0 评论 -
【WinForm】DataGridView鼠标右键点击行显示右键菜单
记录学习过程创建日期:2019-04-13DataGridView鼠标右键点击行显示右键菜单方法/// <summary>/// DataGridView鼠标右键点击行显示右键菜单/// </summary>public static void SetRightButtonDownShowContextMenuStrip(this DataGridView d...原创 2019-04-13 11:39:20 · 2224 阅读 · 0 评论 -
【WinForm】DataGridView显示右键菜单时禁用滑轮事件
DataGridView显示右键菜单时禁用滑轮事件当显示右键菜单时,禁用滑轮事件;关闭右键菜单时,打开滑轮事件方法/// <summary>/// 显示右键菜单时禁用滑轮事件/// </summary>/// <param name="cms">右键菜单</param>/// <par...原创 2019-04-13 11:39:33 · 1311 阅读 · 0 评论 -
【WinForm】DataGridView聚焦指定行
DataGridView聚焦指定行当DataGridView刷新数据后,比如添加一行数据后,刷新整个DataGridView后,想聚焦到新添加的行,可遍历DataGridView列表的ID与新添加的ID是否相同,相同即聚焦该行方法/// <summary>/// DataGridView聚焦指定行/// </summary&...原创 2019-04-13 11:38:54 · 2585 阅读 · 0 评论 -
【WinForm】Form设置窗体居中显示
Form设置窗体居中显示当新实例化的窗体或被最小化的窗体,想居中显示方法/// <summary>/// Form设置窗体居中显示/// </summary>public static void CenterScreen(this Form frm){ //激活窗体 frm.Activate();...原创 2019-04-13 11:36:30 · 11104 阅读 · 0 评论 -
【WinForm】无边框窗体移动
无边框窗体移动当窗体设置为无边框后,比如在窗体顶部添加一个panel控件作为Top,想通过移动panel来移动窗体方法/// <summary>/// 无边框窗体移动/// </summary>/// <param name="control">点击该控件移动窗体</param>public...原创 2019-04-13 11:36:58 · 1720 阅读 · 0 评论 -
【WinForm】保存控件截图DrawToBitmap
保存控件截图DrawToBitmap方法/// <summary>/// 保存控件截图/// </summary>/// <param name="control">指定截图的控件</param>/// <param name="path">截图保存路径</param>...原创 2019-04-13 11:37:41 · 5215 阅读 · 1 评论 -
【WinForm】设置控件里面的所有TextBox只能输入数字
设置控件里面的所有TextBox只能输入数字回顾【WinForm】TextBox只能输入数字只能输入整数private static void tb_KeyPress(object sender, KeyPressEventArgs e){ //如果输入的不是退格和数字,则屏蔽输入 if (!(e.KeyChar == '\b' || (e.KeyCh...原创 2019-04-23 16:39:02 · 1931 阅读 · 0 评论 -
【WinForm】Label设置自动换行
创建日期:2019-04-23Label设置自动换行设置label的AutoSize=true设置label的MaximumSize = new Size(400, 0);指定一个最大的大小,设置一个最大宽度为400当label的宽度大于最大宽度时会自动换行,label的高度也会随之改变...原创 2019-04-23 18:13:56 · 4074 阅读 · 0 评论 -
【WinForm】设置TextBox只能输入整数或数字
创建日期:2019-04-24设置TextBox只能输入整数或数字/// <summary>/// 只能输入整数/// </summary>private static void tb_KeyPressInt(object sender, KeyPressEventArgs e){ //如果输入的不是退格和数字,则屏蔽输入 if (!(e.Key...原创 2019-04-29 14:36:41 · 9384 阅读 · 0 评论 -
【WinForm】C#使用ZXing.Net生成二维码和条形码,包含识别条码内容
首先是生成条码先看看效果新建项目,在项目中引入zxing.dll生成二维码的代码很简单,如下Image image = new BarcodeWriter(){ Format = BarcodeFormat.QR_CODE, Options = new QrCodeEncodingOptions { DisableECI =...原创 2019-05-10 23:37:45 · 6569 阅读 · 4 评论 -
【WinForm】DataGridView实现排序,相当于点击列标题排序
dgv.Sort(ColID, ListSortDirection.Ascending);第一个参数,DataGridView的列 第二个参数,升序或降序原创 2019-04-30 19:32:11 · 2426 阅读 · 0 评论 -
【WinForm】DataGridView单元格居中
单个单元格内容居中dgv.Rows[i].Cells[j].Style.Alignment = DataGridViewContentAlignment.MiddleCenter;全部单元格居中for (int i = 0; i < dgv.Rows.Count; i++){ for (int j = 0; j < dgv.Columns.Count; j++...原创 2019-04-30 19:37:05 · 3156 阅读 · 0 评论 -
【WinForm】TreeView使用,添加节点,拖拽(以年级,班级,学生为例)
先看看效果首选是界面的布局为了避免添加层级的混乱,先规定好层级的关系不能在年级层级添加班级和学生 不能在班级层级添加年级和学生 等等treeView1.SelectedNode.Level 表示树视图的深度我们可以以此来区分层级关系年级 树视图的深度为0 班级 树视图的深度为1 学生 树视图的深度为2添加年级TreeNode treeNode ...原创 2019-05-13 18:42:07 · 2288 阅读 · 0 评论 -
【WinForm】TextBox只能输入中文,英文,数字,不允许输入特殊字符
private void textBox1_KeyPress(object sender, KeyPressEventArgs e){ Regex rg = new Regex("^[\u4e00-\u9fa5a-zA-Z0-9\b]$"); if (!rg.IsMatch(e.KeyChar.ToString())) { e.Handled =...原创 2019-05-22 18:12:55 · 4694 阅读 · 4 评论 -
【WinForm】线程间操作无效: 从不是创建控件的线程访问它
现象有时候,我们需要加载一些比较耗时的操作通常会在线程中加载,而在线程中涉及到UI控件,如下面的写法,就会报错:线程间操作无效: 从不是创建控件“textBox1”的线程访问它。Thread td = new Thread(() =>{ textBox1.Text = "123";});td.Start();解决方法1.不捕获对错误线程的调用...原创 2019-05-30 23:20:12 · 8591 阅读 · 1 评论 -
【WinForm】运行时模仿窗体设计调整控件大小和位置
分析我们先来看看,窗体设计时的控件样式点击控件时会显示4条虚线和8个小矩形,但是同时我们为了绘制虚线和矩形,需要多设置4条底边移动控件时会显示4条实线实现运行时调整控件大小和位置,只需为控件绑定MouseDown,MouseClick,MouseMove,MouseUp事件即可MouseDown:鼠标键按下时,显示灰色实线MouseClick:鼠标单击时,...原创 2019-05-28 16:10:30 · 2471 阅读 · 4 评论 -
【WinForm】TextBox只能输入数字
只能输入整数方法一private void tb_KeyPress(object sender, KeyPressEventArgs e){ //如果输入的不是退格和数字,则屏蔽输入 if (!(e.KeyChar == '\b' || (e.KeyChar >= '0' && e.KeyChar <= '9'))...原创 2019-04-11 16:57:11 · 17171 阅读 · 1 评论