分类目录归档: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

ProcessStartInfo 一定要写全路径

ProcessStartInfo 一定要写全路径,不然会出现一些莫明其妙的错误,比如开机自动启动时打不开。

ProcessStartInfo p1 = new ProcessStartInfo($"{Application.StartupPath}\\PD101AHelper.exe", $"{address} \"{windowShowMsg.Trim()}\"  \"{zhShowMsg2 ?? ""}\"");

p1.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(p1);

C#在线程中使用Invoke来调用UI线程里的控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace TextTool
{
    public partial class Form1 : Form
    {
        private Thread workThread = null; //工作线程
        private List <string> fileList = new List <string>();
        public Form1()
        {
            InitializeComponent();
        }

        // 导入 可多选
        private void button1_Click(object sender, EventArgs e)
        {
            Stream mystream;
            OpenFileDialog openfiledialog1 = new OpenFileDialog();
            openfiledialog1.Multiselect = true;//允许同时选择多个文件
            openfiledialog1.Filter = "txt files(*.txt)|*.txt|All files(*.*)|*.*" ;
            openfiledialog1.FilterIndex = 1;
            openfiledialog1.RestoreDirectory = true;
            if (openfiledialog1.ShowDialog() == DialogResult.OK)
            {
                if ((mystream = openfiledialog1.OpenFile()) != null)
                {
                    fileList.Clear();
                    for (int fi = 0; fi < openfiledialog1.FileNames.Length; fi++)
                    {
                        fileList.Add(openfiledialog1.FileNames[fi]);
                    }
                    mystream.Close();
                }

                listView1.Items.Clear();
                foreach (var filePath in fileList)
                {
                    ListViewItem lvi = new ListViewItem(filePath);
                    listView1.Items.Add(lvi);
                }
            }
        }

        // 合并处理并输出
        private void button2_Click(object sender, EventArgs e)
        {
            if (fileList.Count == 0)
            {
                MessageBox.Show("请先添加要处理的文件" );
                return;
            }

            SaveFileDialog savefiledialog1 = new SaveFileDialog();
            savefiledialog1.Filter = "txt files(*.txt)|*.txt" ;
            if (savefiledialog1.ShowDialog() == DialogResult.OK)
            {
                button2.Text = "处理中..." ;
                button2.Enabled = false;

                workThread = new Thread (WorkThread);
                workThread.Start(savefiledialog1.FileName);
            }
        }

        private int MyCompareString(string x, string y)
        {
            int pos1 = x.IndexOf("(" );
            int pos2 = x.IndexOf(")" );
            int cnt1 = Convert .ToInt32(x.Substring(pos1 + 1, pos2-pos1 -1));

            pos1 = y.IndexOf( "(");
            pos2 = y.IndexOf( ")");
            int cnt2 = Convert .ToInt32(y.Substring(pos1 + 1, pos2 - pos1 - 1));
 
            if (cnt1 > cnt2)
            {
                return -1;
            }
            else if (cnt1< cnt2)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }

        public void WorkThread(object savePath)
        {
            List<string > allLines = new List< string>();
            foreach (var filePath in fileList)
            {
                allLines.AddRange( File.ReadAllLines(filePath));
            }

            int totalCount = 0;
            List<string > outputList = new List< string>();
            foreach (var line in (from t in allLines where t.Trim() != "" select t).Distinct())
            {
                int count = (from c in allLines where c == line select c).Count();
                totalCount += count;
                outputList.Add( $"{line} ( {count})");
            }
            outputList.Sort(MyCompareString);
            outputList.Add( $"总数:{totalCount}" );
            File.WriteAllLines(savePath.ToString(), outputList);

            Invoke( new MethodInvoker (delegate ()
            {
                button2.Text = "合并处理输出" ;
                button2.Enabled = true;
                MessageBox.Show("处理完成!" );
            }));
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (workThread != null && workThread.IsAlive)
            {
                workThread.Abort();
            }
        }
    }
}

如果是WPF程序,则在线程中像下面这样操作控件

this.Dispatcher.Invoke(new Action( delegate
{
    lblState.Content = "正在检测域名" + fullUrl;
}));

给软件加控制功能,可以随时中断使用

public void RemoteCtrl()
{
    WebClient web = new WebClient();
    web.Encoding = Encoding.UTF8;
    string json = web.DownloadString("http://softapi.ilinshu.cn/softinfo/query/1" );
    SoftInfo si = JsonConvert.DeserializeObject<SoftInfo >(json);
    if (si.State != 0)
    {
        MessageBox.Show(si.ErrorMessage, "内部错误" , MessageBoxButtons .OK, MessageBoxIcon.Stop);
        Environment.Exit(0);
        return;
    }
}

C#下载网页图片

static void Main(string [] args)
{
    string url1 = "http://my.oschina.net/js/ke/plugins/emoticons/{0}.gif" ;
    for(int i=0; i<135; i++)
    {
        string url = string.Format(url1, i);
        WebRequest request = WebRequest .Create(url);
        WebResponse response = request.GetResponse();
        Stream reader = response.GetResponseStream();
        FileStream writer = new FileStream (@"E:\临时测试\ConsoleApplication2\新建文件夹\" + i.ToString() + ".gif", FileMode.OpenOrCreate, FileAccess.Write);
        byte[] buff = new byte[512];
        int c = 0; //实际读取的字节数
        while ((c = reader.Read(buff, 0, buff.Length)) > 0)
        {
            writer.Write(buff, 0, c);
        }
        writer.Close();
        writer.Dispose();
        reader.Close();
        reader.Dispose();
        response.Close();
    }
    Console.WriteLine( "下载完成.." );
}