标签: winform

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

    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

    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文本框上按回车切换到下一个输入

    WinForm文本框上按回车切换到下一个输入

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if ((ActiveControl is TextBox || ActiveControl is ComboBox) && keyData == Keys.Enter)
        {
            keyData = Keys.Tab;
        }
        return base.ProcessDialogKey(keyData);
    }
  • C# WINFORM使用html css里十六进制颜色格式

    C# WINFORM使用html css里十六进制颜色格式:

    BackColor = ColorTranslator.FromHtml("#626262");
  • WinForm listBox 按住ctrl/shift 多选

    WinForm listBox 按住ctrl/shift 多选,代码如下:

    listBox1.SelectionMode = SelectionMode.MultiExtended;

  • WinForm中richTextBox1换行

    WinForm中richTextBox1换行

    richTextBox1.Text += "【" + DateTime .Now.ToLongTimeString() + "】" + log;
    this.richTextBox1.AppendText( Environment.NewLine);

  • WinForm listView自动滚动

    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 Winform排错记录

    遇到 .NET Winform 报错,错误信息如下:

    Description: The process was terminated due to an unhandled exception.
    Exception Info: System.IO.FileNotFoundException

    可能是因为没有把需要的DLL程序集和EXE放到一起引起的。

  • 关于.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);
        }    
    }