C#小结:以Winform为例,总结一些C#在桌面开发中一些技巧

目录

一、DataGridView给实体增加按钮

二、Panel嵌套子窗体

三、Dialog对话框获取文件路径

1.获取文件路径

2. 获取当前系统目录

3. 打开指定路径文件夹

4.根据文件路径获取文件夹路径

四、TreeView的展开和删除特定节点

五、PictureBox图片按钮的用法

六、TextBox & numericUpDown详解

七、【窗体】提示/询问/输入/开闭/隐藏/样式说明/强制退出

【1.提示弹窗、对话弹窗、开关隐】

【2.强制退出】

 【3.弹窗输入-封装】

【4.一次打开一窗体】

八、tabcontrol多标签控件的应用

九、ListView的添加列

十、Combobox组合框设置

十一、Checkbox选中和不选中

十二、DateTimePicker时间选择器

十三、Button的灵动变色、打开文件夹、退出系统

【灵动变色】

【退出系统】

十四、Timer定时触发事件

十五、BackgroundImage背景图片设置

十六、窗体之间的信息传递

十七、窗体保持最前 

十八、导出到粘贴板

十九、图片(头像)的读取和保存

二十、清空某groupbox的文本框、选择框

二十二、窗体置顶

二十三、多线程编程(窗体不卡死)

二十四、ICON打包


一、DataGridView给实体增加按钮

参考我的另一篇笔记

二、Panel嵌套子窗体

(此处假设form2是子窗体,被嵌入在panel里面)

 private void button2_Click(object sender, EventArgs e)
 {

     Form2 form2 = new Form2();
     panel1.Controls.Clear();//清空旧控件
     form2.TopLevel = false;//嵌入模式
     form2.Parent = panel1;//转移控件
     form2.Dock = DockStyle.Fill;//转移控件
     form2.FormBorderStyle= FormBorderStyle.None;//不显示标题栏
     form2.Show();

 }

【恢复默认控件和跳转窗体】

public partial class MainForm : Form
{
    Control defaultControl;
    public MainForm()
    {
        InitializeComponent();
        defaultControl = panel1.Controls[0];
    }
    /// <summary>
    /// 查看信息窗体
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        // 显示默认控件
        panel1.Controls.Clear();
        panel1.Controls.Add(defaultControl);
    }
    /// <summary>
    /// 打卡管理窗体
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        CheckInForm form2 = new CheckInForm();
        panel1.Controls.Clear();//清空旧控件
        form2.TopLevel = false;//嵌入模式
        form2.Parent = panel1;//转移控件
        form2.Dock = DockStyle.Fill;//转移控件
        form2.FormBorderStyle = FormBorderStyle.None;//不显示标题栏
        form2.Show();
    }
}

三、Dialog对话框获取文件路径

1.获取文件路径

 private void button4_Click(object sender, EventArgs e)
 {
     using (var dialog = new FolderBrowserDialog())
     {
         DialogResult result = dialog.ShowDialog();
         if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(dialog.SelectedPath))
         {
             // 用户选择了一个有效的文件夹路径
             string path = dialog.SelectedPath;
             // 这里可以做一些对该路径的操作
             ;
         }
     }
 }

2. 获取当前系统目录

Directory.GetCurrentDirectory(); // 获取当前目录

目录输出形如:

F:\C_program\WinFormsApp1\WinFormsApp1\bin\Debug\net8.0-windows

3. 打开指定路径文件夹

//输入文件夹路径,打开文件夹
private void OpenFolder(string FolderPath)
{
    if (Directory.Exists(FolderPath))
    {
        Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\explorer.exe", FolderPath);
    }
    else
    {
        MessageBox.Show("指定的路径不存在!");
    }
}

4.根据文件路径获取文件夹路径

//输入文件路径,输出文件夹路径
private string GetFolderPath(string Filepath)
{
    return Path.GetDirectoryName(Filepath); 
}

四、TreeView的展开和删除特定节点

        private void Form4_Load(object sender, EventArgs e)
        {
            //展开树
            treeView1.ExpandAll();
            //获取指定索引的某节点、某子节点
            var parent = treeView1.Nodes[1];
            var child = treeView1.Nodes[1].Nodes[0];
            //去除某节点
            parent.Nodes.Remove(child);
        }

五、PictureBox图片按钮的用法

效果:移动到上面一张图,移动走又是一张图(需要事件里面双击进入)

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)//鼠标移动进来
        {
            pictureBox1.BackColor = Color.IndianRed;//换背景颜色
            pictureBox1.Image = Properties.Resources.pics1;//换图像
        }

        private void pictureBox1_MouseLeave(object sender, EventArgs e)//鼠标移动开
        {
            pictureBox1.BackColor = Color.White;
            pictureBox1.Image = Properties.Resources.pics2;
        }

六、TextBox & numericUpDown详解

1.textbox设置多行:属性Multiline设置为True

2.【textbox双击进入】TextChanged事件:输入框内容改变时触发方法

  //一个方法中调用另一个按钮方法     
private void textBox_title_TextChanged(object sender, EventArgs e)
{
   button6_Click(sender, e);
}
  • numericUpDown实现类似的效果就不是双击那么简单了,而是需要订阅:KeyUp事件 和 Click 事件(两个都要订阅)

3.textbox灰色提示语设置

备注:如果是新版,可以直接配置,不用写代码

private string defaultValue = "请输入你的用户名";//01
public Form1()
{
    InitializeComponent();
    // 02 设置提示文本
    textBox1.Text = defaultValue;
    textBox1.ForeColor = Color.Gray;
}

//03鼠标双击订阅
private void textBox1_Enter(object sender, EventArgs e)
{
    if (textBox1.Text == defaultValue)
    {
        textBox1.Text = "";
        textBox1.ForeColor = Color.Black; // 设置文本颜色为黑色
    }
}

//04鼠标双击订阅
private void textBox1_Leave(object sender, EventArgs e)
{

    if (string.IsNullOrWhiteSpace(textBox1.Text))
    {
        textBox1.Text = defaultValue;
        textBox1.ForeColor = Color.Gray; // 设置提示文本颜色为灰色
    }
}

七、【窗体】提示/询问/输入/开闭/隐藏/样式说明/强制退出

【1.提示弹窗、对话弹窗、开关隐】

//提示弹窗
private DialogResult Popup(string data)
{
     return MessageBox.Show(data, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

//对话弹窗
private bool PopUpDialog(string message)
{
     DialogResult result = MessageBox.Show(message, "提示", MessageBoxButtons.OKCancel);
     return result == DialogResult.OK;
}

//打开新窗体
MainForm mainForm = new MainForm();
mainForm.Show();

//关闭当前窗体进程(子窗体也会被关闭)
this.Close();

//隐藏当前窗体(不影响其他窗体)
this.Hide();

【样式说明】

1.窗体设置不允许用户放缩:FormBorderStyle:FixedSingle
2.窗体设置不允许用户放大按钮:MaximizeBox: False
3.窗体背景模式:BackgroundImageLayout:Stretch

public Form1()
{
    InitializeComponent();
    this.MaximizeBox = false;//禁止方法
    this.FormBorderStyle = FormBorderStyle.FixedSingle;//禁止拉伸窗口
}

【2.强制退出】

关闭所有窗体线程(解决点了关闭也不能退出线程的问题)

方法:找到对应窗体的FormClosing事件

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            Application.Exit();//强制关闭所有窗体
        }

 【3.弹窗输入-封装】

/// <summary>
/// 弹出输入框:True表示密码正确
/// </summary>
/// <param name="tips"></param>
/// <param name="pwd"></param>
/// <returns></returns>
private bool PoupupInuput(string pwd, string tips = "请输入:")
{
    // 创建一个新的Form作为对话框  
    using (Form inputForm = new Form())
    {
        inputForm.Text = "【提示】";
        inputForm.Size = new System.Drawing.Size(400, 180);
        inputForm.FormBorderStyle = FormBorderStyle.FixedDialog;
        inputForm.StartPosition = FormStartPosition.CenterScreen;

        // 添加一个标签和一个文本框  
        Label lblInput = new Label();
        lblInput.Text = tips;
        lblInput.Width = 200;
        lblInput.Location = new System.Drawing.Point(10, 10);
        inputForm.Controls.Add(lblInput);

        TextBox txtInput = new TextBox();
        txtInput.Location = new System.Drawing.Point(20, 40);
        txtInput.Size = new System.Drawing.Size(260, 20);
        txtInput.Width = 330;
        inputForm.Controls.Add(txtInput);

        // 添加确定和取消按钮  
        Button btnOK = new Button();
        btnOK.Text = "确定";
        btnOK.Location = new System.Drawing.Point(100, 80);
        btnOK.Height = 35;
        btnOK.Click += (s, ev) => { inputForm.DialogResult = DialogResult.OK; };
        inputForm.Controls.Add(btnOK);

        Button btnCancel = new Button();
        btnCancel.Text = "取消";
        btnCancel.Location = new System.Drawing.Point(200, 80);
        btnCancel.Height = 35;
        btnCancel.Click += (s, ev) => { inputForm.DialogResult = DialogResult.Cancel; };
        inputForm.Controls.Add(btnCancel);

        // 显示对话框并获取结果  
        bool result = txtInput.Text.Trim().Equals(pwd.Trim());
        while (!result)
        {
            // 显示输入表单对话框,并等待用户操作
            if (inputForm.ShowDialog() == DialogResult.OK)
            {
                string userInput = txtInput.Text.Trim();

                // 检查用户输入是否为空
                if (string.IsNullOrEmpty(userInput))
                {
                    MessageBox.Show("密码不能为空,请输入您的密码!");
                }
                else if (userInput.Equals(pwd.Trim()))// 密码正确
                {
                    
                    result = true;
                }
                else// 密码错误
                {                   
                    MessageBox.Show("密码错误,请重新输入您的密码!");
                }
            }
            else//点击了取消
            {                 
                break; // 退出循环
            }
        }
        return result;
    }
}

【3.弹窗输入-调用示例】

 var flag = PoupupInuput("123", "请输入重置密码");//密码设置为123,提示语为“请输入重置密码”
 if (flag)//用户输入密码为123时
 {
     //执行相关操作
 }

【4.一次打开一窗体】

FCForm fc = new FCForm();//窗体要放在外面
private void button2_Click(object sender, EventArgs e)
{
    NotExistThenOpen(fc);//不存在则打开,存在则放到最前面
}

// 封装的方法,不存在则开启
private void NotExistThenOpen<T>(T form) where T : Form
{
    bool isOpen = false;

    // 检查是否已有窗体打开
    foreach (Form f in Application.OpenForms)
    {
        if (f is T) // 如果有相同类型的窗体已经打开
        {
            isOpen = true;
            f.BringToFront(); // 将现有窗体带到前面
            break;
        }
    }

    // 如果窗体没有打开且没有被销毁,直接显示
    if (!isOpen)
    {
        if (form.IsDisposed) // 如果窗体已经被销毁
        {
            var type = typeof(T);
            form = (T)Activator.CreateInstance(type); // 重新创建一个新的窗体实例
        }
        form.Show(); // 显示窗体
    }
}

八、tabcontrol多标签控件的应用

【设置标签】

【标签切换事件】

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (tabControl1.SelectedIndex == 0)//切换到第一页
    {
            
    }
}

【删除多余标签页】

tabControl1.TabPages.RemoveAt(3); // 移除第四个标签
tabControl1.TabPages.RemoveAt(2); // 移除第三个标签

九、ListView的添加列

【添加列代码】(需要按顺序填,初始化填第一个,不要多填!)

// 清空现有列表视图中的项
listView1.Items.Clear();
// 将筛选后的数据填充到 ListView 控件中
foreach (var row in list)
{
    ListViewItem item = new ListViewItem(row.Remarks);
    item.SubItems.Add(row.LeaderName);
    item.SubItems.Add(row.LeaderView);
    item.SubItems.Add(row.StartTime.ToString());
    item.SubItems.Add(row.EndTime.ToString());
    listView1.Items.Add(item);
}

【悬浮显示隐藏内容】很推荐开启!

十、Combobox组合框设置

1.设为不可编辑:设置Combox.DropDownStyle = DropDownStyle.DropDownList
2.默认索引:comboBox.SelectedIndex = 0;(初始化代码)

3.【双击进入】更改选择值事件SelectedIndexChanged

4.读取文本和索引:

string selectedText = comboBox.SelectedItem.ToString();//选中的文本
string selectedText2 = comboBox.Text;//选中或者输入的文本(推荐)
int index = comboBox.SelectedIndex; //选中的索引

5.下拉框内容填充:

//获取到列表List<string> list 
//下拉列表填充
comboBox.DataSource= list;

6.根据字符串锁定对应内容

例如我的comboBox有男、女、未知三个下拉,以下代码能默认选中内容为“男”的选项。

comboBox.SelectedIndex = comboBox.FindStringExact("男");

7.获取它的选项列表

List<string> items = comboBox1.Items.Cast<string>().ToList();

8.联想输入(Combox.DropDownStyle设置为默认=DropDown)

private List<string> data = new List<string>(); // 假设数据源是一个字符串列表
public Form1()
{
    InitializeComponent();
    InitializeData(); // 初始化数据源
    InitializeComboBox(); // 初始化 ComboBox
}
private void InitializeData()
{
    // 假设有一些数据
    data.Add("Apple");
    data.Add("Banana");
    data.Add("Orange");
    data.Add("Pineapple");
    data.Add("Grapes");
}

private void InitializeComboBox()
{
    // 绑定数据源到 ComboBox
    comboBox1.DataSource = data;
    comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest; // 设置自动完成模式为建议
    comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; // 设置自动完成源为自定义
    AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
    collection.AddRange(data.ToArray()); // 将数据源添加到自动完成字符串集合中
    comboBox1.AutoCompleteCustomSource = collection; // 设置自动完成自定义源为集合
}

【封装写法】

private void SetComboboxSuggest(ComboBox comboBox1, List<string> data)
{
    comboBox1.DataSource = data;// 绑定数据源到 ComboBox
    comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest; // 设置自动完成模式为建议
    comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; // 设置自动完成源为自定义
    AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
    collection.AddRange(data.ToArray()); // 将数据源添加到自动完成字符串集合中
    comboBox1.AutoCompleteCustomSource = collection; // 设置自动完成自定义源为集合
}

十一、Checkbox选中和不选中

【双击进入写代码】

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox1.Checked)
    {
        // 复选框被选中
        // 在这里添加处理复选框被选中时的逻辑
    }
    else
    {
        // 复选框未被选中
        // 在这里添加处理复选框未被选中时的逻辑
    }
}

十二、DateTimePicker时间选择器

【时间格式和下拉方式】

【Long和Time的拼接】 

//拼接时间
DateTime datePart = dateTimePicker1.Value.Date;//年月日时间 Long
TimeSpan timePart = dateTimePicker2.Value.TimeOfDay;//时分秒时间 Time
DateTime start = datePart.Add(timePart);

【赋值】

dateTimePicker1.Value = (DateTime)user.JoinTime;

【自定义时间格式】

 dateTimePicker1.Format = DateTimePickerFormat.Custom;
 dateTimePicker1.CustomFormat = "HH:mm";

十三、Button的灵动变色、打开文件夹、退出系统

【灵动变色】

private void button2_MouseLeave(object sender, EventArgs e)//鼠标离开
{
    button2.BackColor=Color.FromArgb(192, 255, 192);
}

private void button2_MouseMove(object sender, MouseEventArgs e)//鼠标移进来
{
    button2.BackColor = Color.Cyan;
}

【退出系统】

private void button1_Click(object sender, EventArgs e)
{
    Application.Exit(); // 退出应用程序
}

十四、Timer定时触发事件

第一步,工具箱拉好控件(timer)

第二步,设置好定时器名字和间隔时间

 第三步,双击Timer,写定时器方法:

private void timer1_Tick(object sender, EventArgs e)// 计时器中的方法
{
    label2.Text = DateTime.Now.ToString("HH:mm:ss"); //给label2赋上当前时间
}

 第四步,用双击按钮,调用定时器方法

private void button2_Click(object sender, EventArgs e)
{
    timer1.Start();//隔一段时间执行一次计时器中的方法
}

【备注】timer1.Stop();是停止的定时器方法的方法。

实现效果:点击按钮后,label2每秒更新一次现在的时间。

十五、BackgroundImage背景图片设置

点击一下窗体,在属性处选择图片及其模式

十六、窗体之间的信息传递

【法一:构造函数】打开其余窗体时,通过构造函数入参方式传入

【法二:静态变量】上面是主窗体,传递给其余窗体

十七、窗体保持最前 

 public MainWindow()
{
    InitializeComponent();
    this.Topmost = true;//窗体保持最前
}

十八、导出到粘贴板

作用:点击按钮,导出相应字符串到粘贴板中

(不推荐以下写法,可能不支持跨平台)

private void button1_Click_1(object sender, EventArgs e)
{
   string textToCopy = "要复制到剪贴板的文本";
   Clipboard.SetText(textToCopy);
}

 (推荐以下写法)

Clipboard.SetDataObject(connectionstring, true, 10, 200);
  • text:要写入剪贴板的字符串数据。
  • true:如果您希望数据在此应用程序退出后保留在剪贴板上,则为true
  • 10:重试次数。如果在设置剪贴板内容时发生异常,系统会重试最多10次。
  • 200:重试间隔(单位为毫秒)。系统在每次重试之间等待200毫秒。

十九、图片(头像)的读取和保存

1.图片的读取

string imagePath = "C:\\Users\\ASUS\\Pictures\\Saved Pictures\\我的头像.jpg";
// 检查文件是否存在  
if (System.IO.File.Exists(imagePath))
{
   // 如果文件存在,则加载图片  
   pictureBox1.Image = Image.FromFile(imagePath);
   pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
}

2.图片的保存

 using (OpenFileDialog openFileDialog = new OpenFileDialog())
 {    
     openFileDialog.Filter = "Image Files (*.jpg, *.jpeg, *.png, *.gif)|*.jpg;*.jpeg;*.png;*.gif";// 设置文件类型过滤器,只显示图片文件  
     if (openFileDialog.ShowDialog() == DialogResult.OK)// 显示对话框,让用户选择文件  
     {
         // 获取用户选择的文件路径  
         string sourceFilePath = openFileDialog.FileName;
         // 指定要保存到的目标路径和文件名  
         string targetFilePath = @"F:\【UI】\YourImage.jpg"; // 保存到的完整文件路径
         try
         {
             // 复制文件到目标路径  
             File.Copy(sourceFilePath, targetFilePath, true); // true表示如果目标文件已存在,则覆盖它  
             MessageBox.Show("图片已成功保存到指定路径!");
         }
         catch (Exception ex)
         {
             // 处理任何可能发生的异常,例如权限问题或磁盘空间不足等  
             MessageBox.Show("保存图片时发生错误: " + ex.Message);
         }
     }
 }

二十、清空某groupbox的文本框、选择框

(包括textbox、checkbox和radiobutton)

private void button1_Click(object sender, EventArgs e)
{
    foreach (Control control in groupBox1.Controls)
    {
        if (control is TextBox textBox)
        {
            textBox.Clear(); // 清空文本框
        }
        else if (control is CheckBox checkBox)
        {
            checkBox.Checked = false; // 清空复选框
        }
        else if (control is RadioButton radioButton)
        {
            radioButton.Checked = false; // 清空单选框
        }
    }
}

二十二、窗体置顶

public FCForm()
{
    InitializeComponent();
    this.TopMost = true; // 在构造函数中设置为置顶
}

二十三、多线程编程(窗体不卡死)

两个步骤如下:

private async void button1_Click(object sender, EventArgs e)//【步骤一】触发方法加上async
{
    connectionstring = textBox1.Text.Trim();
    try
    {
        //【步骤二】调用方法加上await
        await Task.Run(() =>
        {
            fsql = new FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.SqlServer, connectionstring)
                .Build();   //具体操作加上await Task.Run(() =>
        });

        AddDbCombox();
        SetTips("连接成功!", 1);
    }
    catch (Exception ex)
    {
        SetTips($"连接失败,字符串: {connectionstring}, 错误: {ex.Message}", 1);
    }
}

二十四、ICON打包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值