目录
七、【窗体】提示/询问/输入/开闭/隐藏/样式说明/强制退出
一、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);
}
}