跳转至

常用控件3

单选按钮 和 分组框

System.Windows.Forms.RadioButton 是单选按钮。

为了将多个 RadioButton 分成不同的组,通常将它们放置在 System.Windows.Forms.GroupBoxPanel 控件中。

说明

在同一个容器控件(如 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 用于向用户显示耗时操作的进度。

说明

可以设置 MinimumMaximum 属性来定义进度的范围,然后通过更新 Value 属性来显示进度。

// 设置进度范围
progressBar.Minimum = 0;
progressBar.Maximum = 100;

// 更新进度
progressBar.Value = 50; // 进度达到 50%

对于无法确定进度的任务,可以将 Style 属性设置为 Marquee,进度条会显示连续滚动的动画。

progressBar.Style = ProgressBarStyle.Marquee;
progressBar.MarqueeAnimationSpeed = 30; // 动画速度

在后台线程中更新进度条

直接在非 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

// 获取数字
decimal number = numericUpDown.Value;

// 设置数字
numericUpDown.Value = 100;

日期时间选择器

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 路径下保存文件
    }
}

选择多个文件

设置 OpenFileDialogMultiselect 属性为 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)
        {
            // 处理每个文件路径
        }
    }
}