winform知识

摘要:
C#界面假死问题当一个WinForm程序在事件函数中进行IO操作、网络操作或耗CPU大的操作时,窗体会出现明显的卡顿现象。然而从另外一个线程操作windows窗体上的控件,就会和主线程产生竞争,造成不可预料的结果。因为windowsGUI编程有一个规则,就是只能通过创建控件的线程来操作控件的数据。

控件相关

1.文本框/label高度

文本框Multiline属性,设为true就可以了。改完高度后再将此属性改回来,要不然多行文本框,按回去就去下一行了。

label的改autoSize属性,设为false就可以了。

2.控件中文字居中

TextAlign属性:MiddleCenter

3.颜色属性

直接输入 #xxxx

winform知识第1张

4.如何去掉button按钮的边框线

设置FlatStyle为Flat,并且设置FlatAppearance下的BorderSize为0。将按钮所在的容器的底色和按钮颜色设置为不同的。

5.ComboBox

下拉列表的高度通过字体大小来改变,微软雅黑,12pt(小四)

DrawMode 默认设置为normal就好,设置为 OwnerDrawVariable,高度可变,但是此时下拉列表的值为不可见的(尽管存在)。

6.DataGridView

  • 宽度和字体

显示宽度属性:AutoSizeColumnsMode:AllCells

或者设置高度小一点:winform知识第2张

字体:columnHeadersDefaultCellStyle、DefaultCellStyle

  • 类型checkboxColumn的选中

首先DataGridView必须设置可编辑。

1、用DataGridViewRow.Cells[0].EditedFormattedValue.ToString()=="True"

不用FormattedValue,它是操作提交后的结果,而EditedFormattedValue是当前的结果,不管结果是否已经提交。
2、DataGridViewCheckBoxColumn设置CheckBox默认选中

((DataGridViewCheckBoxCell)dgvDownloadList.Rows[i].Cells["Column1"]).Value = true;

3、设置是否选中

dataGridViewSiteInfo.Rows[i].Cells[0].Value = "True";

http://blog.csdn.net/wzy0754/article/details/52368377

  • 单击DataGridView中一单元格后立即进入编辑状态

将datagridview1的SelectionMode设置为FullRowSelect(某一行全选中),

在双击事件中代码如下

private void datagridview1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{ this.datagridview1.Rows[e.RowIndex].Cells[e.ColumnIndex].ReadOnly = false;//将当前单元格设为可读

7.datetimepicker初始为空值的方法

方法一:

在窗口初始化函数中添加,并在日期改变事件里定义格式:

winform知识第3张winform知识第4张
dateTimePickerEnd.Format =DateTimePickerFormat.Custom;
dateTimePickerEnd.CustomFormat = " ";
private void dateTimePickerEnd_ValueChanged(objectsender, EventArgs e)
{
dateTimePickerEnd.CustomFormat =  "yyyy-MM-dd HH:mm:ss";
}
View Code

方法二:

在日期控件上面覆盖一个文本框,然后初始化时候文本框是空值,每次日期选择之后将值赋在文本框里面。

窗体属性

1. 窗体不加边框

this.FormBorderStyle =FormBorderStyle.FixedToolWindow;
this.StartPosition = FormStartPosition.CenterScreen;

2. 窗体只显示一个

staticformDevice _formDevice;
 if(_formDevice==null||_formDevice.IsDisposed )
            {
                _formDevice = newformDevice();
                _formDevice.Show();
            }
            else
            {
                _formDevice.WindowState =FormWindowState.Normal;
                _formDevice.Activate();
            }

程序启动【单例】

//获取欲启动进程名
string strProcessName =System.Diagnostics.Process.GetCurrentProcess().ProcessName;
            ////获取版本号
            //CommonData.VersionNumber = Application.ProductVersion;
            //检查进程是否已经启动,已经启动则显示报错信息退出程序。
            if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1)
            {
                MessageBox.Show("程序已经运行!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Application.Exit();
                return;
            }

EXE 图标修改问题

1、窗体属性中找到Icon,单击最右侧的“…”按钮,选择备好的ico图标。【这时窗体图标已经变化了,这是程序内部显示图标的修改方法】

2、程序外部图标的修改方法

右击项目名称,在下拉列表中选择“属性”,

winform知识第5张

会发现生成的bin目录下的exe图标已经发生变化了。

3、修改ico文件,却发现生成的exe图标未发生变化。重新生成项目也一样,清理后再生成也一样

网上看到的解决方案是:

可能是资源管理器的问题,估计它是有一个缓存,所以在资源管理器中总是显示原来那个图标, 我把这个EXE文件拷到其他文件夹下,图标就正确显示了。

还有,你也可以按住CTRL+滚动鼠标 改变图标的大小(文件的大图标显示和小图标显示),这时你也可以观察到已经改变的图标

C#界面假死问题

当一个WinForm程序在事件函数中进行IO操作、网络操作或耗CPU大的操作时,窗体会出现明显的卡顿现象。原因在于窗体的消息循环被耗时的操作停住了,UI线程被阻塞。在相关操作没有完成之前,用户不能对窗体进行任何的操作,包括关闭应用程序。

解决思路是——能不能将阻塞线程的操作在另外一个线程中执行,这样就不会堵塞UI线程

然而从另外一个线程操作windows窗体上的控件,就会和主线程产生竞争,造成不可预料的结果。因为windowsGUI编程有一个规则,就是只能通过创建控件的线程来操作控件的数据

好在因此Control类实现了ISynchronizeInvoke接口,提供了Invoke和BeginInvoke方法来提供让其它线程更新GUI界面控件的机制

两者区别是:Invoke,需要等待委托的方法执行返回后才执行下面的代码;begininvoke则不需要。

winform知识第3张winform知识第7张
        private void buttonX1_Click(objectsender, EventArgs e)  
        {
            Waitting waitting = newWaitting();  
            waitting.Show();  
            Task.Factory.StartNew(() => //将阻塞线程的操作在另外一个线程中执行,这样就不会堵塞UI线程。   
{   
                ConnectSDE(); //运行时间5s左右
                MessageBox.Show("连接SDE数据库成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);  
                waitting.BeginInvoke((Action)waitting.Close);//BeginInvoke方法返回UI线程更新UI界面控件的机制。   
});  
        }
View Code

参考:解决C#界面假死问题

免责声明:文章转载自《winform知识》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webdriver鼠标上下滑动iOS模拟器命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android实现高性能,高并发,可延时线程池管理

android实现高性能,高并发,可延时线程池管理 为什么要使用线程池?  1.)new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。 不利于扩展,比如如定时执行、定期执行、线程中断     2.)采用线...

C# winform DataGridView 常见属性

C# winform DataGridView 属性说明① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤ 行的用户删除操作的自定义 ⑥ 行、列的隐藏和删除 ⑦ 禁止列或者行的Resize ⑧ 列宽和行高以及列头的高度和行头的宽度的自动调整 ⑨ 冻结列或行 ⑩ 列顺序的调整 ⑪ 行头列头的单元格⑫ 剪切板的操作...

WinForm控件之【RichTextBox】

基本介绍 高级文本控件,提供高级文本输入和编辑功能,如字符或段落格式的设置。 常设置属性 DetectUrls:指示是否自动将URL的格式设置为链接; EnableAutoDragDrop:是否启用文本、图片和其他数据的拖放操作; BorderStyle:指示编辑控件是否应带有边框或边框类型; Lines:多行编辑中的文本行,作为字符串值的数组; MaxL...

MFC编程入门之二十(常用控件:静态文本框)

  上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了。从本节开始将讲解各种常用控件的用法。常用控件主要包括:静态文本框、编辑框、单选按钮、复选框、分组框、列表框、组合框、图片控件、列表控件、树形控件和进度条控件等等。本节先来讲解静态文本框的使用。   控件的通知消息   在讲静态文本框的使用之前,先大概讲讲控件的通知消息。   ...

多线程并发详解

一、Java 线程实现/创建方式   注意:   • 新建的线程不会自动开始运行,必须通过start( )方法启动   • 不能直接调用run()来启动线程,这样run()将作为一个普通方法立即执行,执行完毕前其他线程无法并发执行   • Java程序启动时,会立刻创建主线程,main就是在这个线程上运行。当不再产生新线程时,程序是单线程的  1.1 继承...

一道有意思的多线程面试题 C# 代码实现

如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助。鼓励先自己动手实现一遍,做不出来在看代码。 题目一:两个线程交替打印0~100的奇偶数 这道题就是说有两个线程,一个名为偶数线程,一个名为奇数线程,偶数线程只打印偶数,奇数线程只打印奇数,两个线程按顺序交替打印。本文重点不是说的这道题,这道题是下面那道题的简单版本,用来做个过渡。 效果...