winform知识

控件相关

1.文本框/label高度

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

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

2.控件中文字居中

  TextAlign属性:MiddleCenter

 3.颜色属性

  直接输入 #xxxx

 

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

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

5.ComboBox

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

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

6.DataGridView 

  • 宽度和字体

  显示宽度属性:AutoSizeColumnsMode:AllCells

或者设置高度小一点:

字体: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初始为空值的方法

方法一:

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

dateTimePickerEnd.Format = DateTimePickerFormat.Custom;
dateTimePickerEnd.CustomFormat = " ";

private void dateTimePickerEnd_ValueChanged(object sender, EventArgs e)
{
dateTimePickerEnd.CustomFormat =  "yyyy-MM-dd HH:mm:ss";
}
View Code

方法二:

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

窗体属性

1. 窗体不加边框

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

2. 窗体只显示一个

static formDevice _formDevice;
 if(_formDevice==null||_formDevice.IsDisposed )
            {
                _formDevice = new formDevice();
                _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、程序外部图标的修改方法

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

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

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

网上看到的解决方案是:

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

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

C#界面假死问题

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

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

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

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

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

        private void buttonX1_Click(object sender, EventArgs e)  
        {
            Waitting waitting = new Waitting();  
            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#界面假死问题

原文地址:https://www.cnblogs.com/peterYong/p/8603788.html