标签归档:WinForm

C# WinForm设置dataGridView表头字体大小

var font = new Font(dataGridView1.ColumnHeadersDefaultCellStyle.Font.FontFamily, dataGridView1.ColumnHeadersDefaultCellStyle.Font.Size + 8);
dataGridView1.ColumnHeadersDefaultCellStyle.Font = font;

示例

// 构造函数
public HomeForm()
{
        InitializeComponent();
        //奇数行的单元格的背景色为黄绿色
        dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;
        var font = new Font(dataGridView1.ColumnHeadersDefaultCellStyle.Font.FontFamily, dataGridView1.ColumnHeadersDefaultCellStyle.Font.Size + 8);
        dataGridView1.ColumnHeadersDefaultCellStyle.Font = font;
        BindCombox();
        BindDataGrid();
        dataGridView1.Columns[0].Width = 300;
        this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
}

C# WinForm 自动关闭 定时关闭 MessageBox

public class AutoClosingMessageBox
{
    System.Threading.Timer _timeoutTimer;
    string _caption;
    DialogResult _result;
    DialogResult _timerResult;
    AutoClosingMessageBox(string text, string caption, int timeout, MessageBoxButtons buttons = MessageBoxButtons.OK, DialogResult timerResult = DialogResult.None)
    {
        _caption = caption;
        _timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
            null, timeout, System.Threading.Timeout.Infinite);
        _timerResult = timerResult;
        using (_timeoutTimer)
            _result = MessageBox.Show(text, caption, buttons);
    }
    public static DialogResult Show(string text, string caption, int timeout, MessageBoxButtons buttons = MessageBoxButtons.OK, DialogResult timerResult = DialogResult.None)
    {
        return new AutoClosingMessageBox(text, caption, timeout, buttons, timerResult)._result;
    }
    void OnTimerElapsed(object state)
    {
        IntPtr mbWnd = FindWindow("#32770", _caption); // lpClassName is #32770 for MessageBox
        if (mbWnd != IntPtr.Zero)
            SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        _timeoutTimer.Dispose();
        _result = _timerResult;
    }
    const int WM_CLOSE = 0x0010;
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}

用法:

AutoClosingMessageBox.Show("Text", "Caption", 1000);

返回值 

var userResult = AutoClosingMessageBox.Show("Yes or No?", "Caption", 1000, MessageBoxButtons.YesNo);if(userResult == System.Windows.Forms.DialogResult.Yes) {
// do something}

也可以通过Nuget安装这个包

Install-Package AutoClosingMessageBox

WinForm listView自动滚动

使用EnsureVisible可以让listView控件自动滚动。

如下:

ListViewItem item = new ListViewItem (info.CompanyName); //这个是第一行第一列
item.SubItems.Add(info.ZiHao); //第一行第二列
item.SubItems.Add(info.Pinyin);
item.SubItems.Add(info.Attribute);
listView1.Items.Add(item);
listView1.EnsureVisible(item.Index); //自动滚动

关于.NET中 Control.Invoke

Control.Invoke含义是将方法委托给拥有该Control的线程去执行。

其实就是把Invoke里的内容委托给Control所在的线程去执行。如果是this.Invoke,就相当于Invoke里的内容是在主线主线程里运行的(这里默认this主窗口)

实例代码:

this.Invoke((EventHandler )delegate
{
    YzmForm yzm = new YzmForm();
    yzm.SetYzm(img);
    if (yzm.ShowDialog( this) == DialogResult.OK)
    {
        this._yzm = yzm.GetYzm();
    }
});

对于跨线程操作UI控件很好用,可以直接在子线程中把代码委托给主线程执行。

因为夸线程访问控件容易引起问题。所以推荐是谁创建谁调用原则。因为进度条是FORM的子控件,所以用THIS.INVOKE来委托主窗体去调用


补充:这种方式不能在窗体构造函数中使用,会报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

可以用下面的方式:

public void InsertLog(string log)
{
    if (listBoxLog.InvokeRequired)
    {
        this.Invoke( new MethodInvoker(delegate ()
        {
            InsertLog(log);
        }));
    }
    else
    {
        string t = "【" + DateTime .Now.ToString("HH:mm:ss") + "】";
        listBoxLog.Items.Add(t + log);
    }    
}