常用控件3
单选按钮 和 分组框
System.Windows.Forms.RadioButton
是单选按钮。
为了将多个 RadioButton
分成不同的组,通常将它们放置在 System.Windows.Forms.GroupBox
或 Panel
控件中。
说明
在同一个容器控件(如 GroupBox
)内的多个单选按钮会自动实现互斥选择,即用户只能选中其中一个。
事件:选中状态改变
每个 RadioButton
都有一个 CheckedChanged
事件,当其选中状态改变时触发。你可以为组内的每个按钮订阅此事件,或者使用一个通用的事件处理器。
private void HandleRadioButtonCheckedChanged(object sender, EventArgs e)
{
RadioButton rb = sender as RadioButton;
if (rb != null && rb.Checked)
{
// rb.Text 就是被选中的按钮的文本
Console.WriteLine($"选项 '{rb.Text}' 被选中");
}
}
// 在窗体初始化时,为每个按钮添加处理函数
radioButton1.CheckedChanged += HandleRadioButtonCheckedChanged;
radioButton2.CheckedChanged += HandleRadioButtonCheckedChanged;
复选框
System.Windows.Forms.CheckBox
是复选框,允许用户进行多项选择。
事件:选中状态改变
与 RadioButton
类似,CheckBox
也有一个 CheckedChanged
事件。但它的主要属性是 Checked
,可以直接读取或设置其布尔状态。
private void HandleCheckBoxCheckedChanged(object sender, EventArgs e)
{
CheckBox cb = sender as CheckBox;
if (cb != null)
{
// cb.Checked 会返回 true 或 false
Console.WriteLine($"'{cb.Text}' 的状态是: {cb.Checked}");
}
}
// 要得知哪些复选框被选中,可以遍历它们
private void CheckSelectedItems()
{
foreach (Control control in this.Controls)
{
if (control is CheckBox cb && cb.Checked)
{
Console.WriteLine($"'{cb.Text}' 被选中了");
}
}
}
Tab页控件
System.Windows.Forms.TabControl
可以在一个窗口中组织多个页面(TabPage
)。
在 Visual Studio 设计器中,你可以直接向 TabControl
添加或删除 TabPage
,并在每个页面上放置其他控件。每个 TabPage
就像一个独立的容器。
进度条
System.Windows.Forms.ProgressBar
用于向用户显示耗时操作的进度。
说明
可以设置 Minimum
和 Maximum
属性来定义进度的范围,然后通过更新 Value
属性来显示进度。
// 设置进度范围
progressBar.Minimum = 0;
progressBar.Maximum = 100;
// 更新进度
progressBar.Value = 50; // 进度达到 50%
对于无法确定进度的任务,可以将 Style
属性设置为 Marquee
,进度条会显示连续滚动的动画。
在后台线程中更新进度条
直接在非 UI 线程中操作控件会引发异常。在 WinForms 中,推荐使用 BackgroundWorker
来处理此问题。
using System.ComponentModel;
private BackgroundWorker backgroundWorker;
public MyForm()
{
InitializeComponent();
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += Worker_DoWork;
backgroundWorker.ProgressChanged += Worker_ProgressChanged;
backgroundWorker.RunWorkerCompleted += Worker_RunWorkerCompleted;
}
private void startButton_Click(object sender, EventArgs e)
{
if (!backgroundWorker.IsBusy)
{
backgroundWorker.RunWorkerAsync();
}
}
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(50); // 模拟耗时操作
backgroundWorker.ReportProgress(i);
}
}
private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 这个事件在 UI 线程上触发,可以安全地更新进度条
progressBar.Value = e.ProgressPercentage;
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("任务完成!");
}
数字输入框
System.Windows.Forms.NumericUpDown
是一个允许用户通过点击箭头或直接输入来选择数字的控件。
获取/设置数字
使用 Value
属性来获取或设置数字。该属性的类型是 decimal
。
日期时间选择器
System.Windows.Forms.DateTimePicker
用于选择日期和/或时间。
获取/设置日期时间
使用 Value
属性获取或设置一个 DateTime
对象。
// 获取选定的日期时间
DateTime selectedDate = dateTimePicker.Value;
// 将日期格式化为字符串
string dateStr = selectedDate.ToString("yyyy-MM-dd");
// 获取年月日
int year = selectedDate.Year;
int month = selectedDate.Month;
int day = selectedDate.Day;
可以通过 Format
属性来改变其显示模式(例如,只显示时间)。
dateTimePicker.Format = DateTimePickerFormat.Short; // e.g., "8/14/2025"
dateTimePicker.Format = DateTimePickerFormat.Time; // e.g., "3:30:00 PM"
dateTimePicker.Format = DateTimePickerFormat.Custom;
dateTimePicker.CustomFormat = "yyyy-MM-dd HH:mm";
文件和目录选择框
WinForms 提供了多个对话框控件用于文件和目录选择。
选择目录
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
dialog.Description = "选择存储路径";
if (dialog.ShowDialog() == DialogResult.OK)
{
string selectedPath = dialog.SelectedPath;
// 使用 selectedPath
}
}
选择单个文件
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Title = "选择你要上传的图片";
dialog.InitialDirectory = @"D:\data";
dialog.Filter = "图片类型 (*.png;*.jpg;*.bmp)|*.png;*.jpg;*.bmp|所有文件 (*.*)|*.*";
if (dialog.ShowDialog() == DialogResult.OK)
{
string filePath = dialog.FileName;
// 使用 filePath
}
}
保存文件
用法与 OpenFileDialog
类似。
using (SaveFileDialog dialog = new SaveFileDialog())
{
dialog.Title = "保存文件";
dialog.Filter = "JSON类型 (*.json)|*.json";
if (dialog.ShowDialog() == DialogResult.OK)
{
string filePath = dialog.FileName;
// 在 filePath 路径下保存文件
}
}
选择多个文件
设置 OpenFileDialog
的 Multiselect
属性为 true
。
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Title = "选择你要上传的图片";
dialog.Multiselect = true;
dialog.Filter = "图片类型 (*.png;*.jpg;*.bmp)|*.png;*.jpg;*.bmp";
if (dialog.ShowDialog() == DialogResult.OK)
{
// dialog.FileNames 是一个字符串数组
foreach (string filePath in dialog.FileNames)
{
// 处理每个文件路径
}
}
}