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