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

目录

一、DataGridView给实体增加按钮

二、Panel嵌套子窗体

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

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

五、PictureBox图片按钮的用法

六、TextBox详解

七、弹窗的提示、打开和窗体关闭、隐藏、样式说明、强制退出

八、tabcontrol多标签控件的应用

九、ListView的添加列

十、Combobox组合框设置

十一、Checkbox选中和不选中

十二、DateTimePicker时间选择器

十三、Button的灵动变色、打开文件夹

十四、Timer定时触发事件

十五、BackgroundImage背景图片设置

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

十七、窗体保持最前 

十八、导出到粘贴板

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

二十、清空某groupbox的选择框

一、DataGridView给实体增加按钮

【需求】list可以查询到:Title,PublishTime,UserName,Content 
我想将list填充到datagridView中:Title,PublishTime,UserName,其中Content已设置按钮,点击查看后才弹出内容 

【操作步骤】

 【注意】上面的名称填写要对应数据库列名和下面代码的索引(例如Cells["Title"]),启用添加/编辑和删除要去掉,否则最后会多一个空白行。

再设置RowHeadersVisible:False,不要前面那一列

【双击控件进入】增加鼠标点击代码:

 添加代码:【不要多填,表格多少列就填多少列,后面实体可以拿到的】

        private void button6_Click(object sender, EventArgs e)
        {
            //SQL查询到数据,存于list中
            List<InforMessage> list = bll.QueryInforMessage();
            // 清空现有数据
            dataGridView1.Rows.Clear();
            //添加数据
            foreach (var item in list)
            {
                //绑定数据,注意你的不一定是dataGridView1
                int rowIndex = dataGridView1.Rows.Add();
                dataGridView1.Rows[rowIndex].Cells["Title"].Value = item.Title;
                dataGridView1.Rows[rowIndex].Cells["PublishTime"].Value = item.PublishTime;
                dataGridView1.Rows[rowIndex].Cells["UserName"].Value = item.UserName;
                dataGridView1.Rows[rowIndex].Cells["Content"].Value = "点击查看";//按钮名称
                // 将数据实体关联到行的 Tag 属性上以便后续处理
                dataGridView1.Rows[rowIndex].Tag = item;
            }
        }

        // 在 DataGridView 的 CellContentClick (点击某一单元格)事件中处理内容按钮点击事件
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //注意你的不一定是dataGridView1
            if (e.ColumnIndex == dataGridView1.Columns["Content"].Index && e.RowIndex >= 0)//若点击了标签为【Content】列的按钮
            {
                // 获取当前行对应的实体对象【注意修改此处InforMessage类】
                var item = dataGridView1.Rows[e.RowIndex].Tag as InforMessage;
                //将list实体中的content展示出来
                if (item != null)
                {
                    MessageBox.Show(item.Content, "内容详情");
                }
            }
        }

效果:

二、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对话框获取文件路径

 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;
             // 这里可以做一些对该路径的操作
             ;
         }
     }
 }

四、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详解

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

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

  //一个方法中调用另一个按钮方法     
private void textBox_title_TextChanged(object sender, EventArgs e)
{
   button6_Click(sender, e);
}

七、弹窗的提示、打开和窗体关闭、隐藏、样式说明、强制退出

//提示弹窗
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

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

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

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

八、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();//选中的文本
int index = comboBox.SelectedIndex; //选中的索引

5.下拉框内容填充:

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

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

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

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

7.联想输入(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; // 设置自动完成自定义源为集合
}

十一、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;

十三、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 button3_Click(object sender, EventArgs e)
{
    string path = textBox1.Text.Trim(); // 指定的文件夹路径

    if (Directory.Exists(path))
    {
        Process.Start(Environment.GetEnvironmentVariable("WINDIR") + @"\explorer.exe", path);
    }
    else
    {
        MessageBox.Show("指定的路径不存在!");
    }
}

【按钮打开文件对话框】请看大标题三

十四、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);
}

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

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; // 清空单选框
        }
    }
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值