跳转至

常用控件2

组合选择框 (ComboBox)

System.Windows.Forms.ComboBox 是组合选择框,用于从下拉列表中选择一项。

事件:选项改变

如果用户修改了 ComboBox 中的选项,会触发 SelectedIndexChanged 事件。

comboBox.SelectedIndexChanged += new EventHandler(HandleSelectionChange);

private void HandleSelectionChange(object sender, EventArgs e)
{
    ComboBox cb = sender as ComboBox;
    // 处理选项改变,例如获取当前选中的文本
    string selectedText = cb.SelectedItem.ToString();
}

添加一个选项

代码中可以使用 Items.Add 方法来添加一个选项到末尾。

comboBox.Items.Add("byhy");

添加多个选项

代码中可以使用 Items.AddRange 方法来添加多个选项到末尾。

comboBox.Items.AddRange(new object[] { "byhy", "白月黑羽", "csharp教程" });

清空选项

代码中可以使用 Items.Clear 方法来清空所有选项。

comboBox.Items.Clear();

获取当前选项文本

代码中可以使用 SelectedItemText 属性来获取当前选中的选项的文本。

// 获取选中项对象,然后转换为字符串
string method = comboBox.SelectedItem.ToString();

// 或者直接获取文本框中显示的文本
string text = comboBox.Text;

设置当前选中项

可以通过 SelectedIndexSelectedItem 属性来设置当前选中的项。

// 通过索引设置
comboBox.SelectedIndex = 0; // 选中第一项
// 通过对象设置
comboBox.SelectedItem = "byhy"; // 选中指定文本

列表框 (ListBox)

System.Windows.Forms.ListBox 是列表控件,用于显示一个项目列表。

添加一个列表项

使用 Items.Add 方法添加一个列表项到末尾。

listBox.Items.Add("byhy");

添加多个列表项

使用 Items.AddRange 方法添加多个列表项。

listBox.Items.AddRange(new object[] { "byhy", "白月黑羽", "csharp教程" });

删除一个列表项

使用 Items.RemoveAt 方法删除指定索引的列表项。

// 删除第二个列表项
listBox.Items.RemoveAt(1);

清空列表项

使用 Items.Clear 方法删除所有列表项。

listBox.Items.Clear();

设置当前选中项

通过 SelectedIndexSelectedItem 属性设置当前选中的项。

// 通过索引设置
listBox.SelectedIndex = 0; // 选中第一项

// 通过对象设置
listBox.SelectedItem = "byhy";

获取当前列表项文本

通过 SelectedItemText 属性获取。

string selectedText = listBox.SelectedItem.ToString();

遍历列表项

可以这样遍历列表里面的每个 item:

foreach (var item in listBox.Items)
{
    // 处理 item
    Console.WriteLine(item.ToString());
}

事件:选项选择改变

当用户选择的项发生改变时,会触发 SelectedIndexChanged 事件。

listBox.SelectedIndexChanged += new EventHandler(HandleSelectionChange);

private void HandleSelectionChange(object sender, EventArgs e)
{
    if (listBox.SelectedItem != null)
    {
        string currentItemText = listBox.SelectedItem.ToString();
        // 处理选择改变
    }
}

列表项文本可编辑

WinForms 的 ListBox 不直接支持编辑列表项。要实现此功能,通常需要自定义控件或在需要编辑时动态地在列表项上覆盖一个 TextBox 控件,这是一个高级主题。

设置可拖拽排序和多选

  • 多选:通过 SelectionMode 属性设置。
// 允许多选
listBox.SelectionMode = SelectionMode.MultiExtended;
  • 拖拽排序:需要手动实现 MouseDown, DragEnter, DragDrop 等事件,这也是一个高级主题。

表格 (DataGridView)

System.Windows.Forms.DataGridView 是功能强大的表格控件。

创建列和标题栏

可以在 Visual Studio 的设计器中通过“编辑列”对话框来设置,也可以在代码中动态创建。

// 添加一个名为 "Name" 的列,标题为 "名称"
dataGridView.Columns.Add("Name", "名称");
dataGridView.Columns.Add("Value", "值");

添加一行

Rows.Add 方法可以添加一行。

// 添加一行并填充数据
dataGridView.Rows.Add("白月黑羽", "优秀");

删除一行

Rows.RemoveAt 方法可以删除指定位置的一行。

// 删除第一行
if (dataGridView.Rows.Count > 0)
{
    dataGridView.Rows.RemoveAt(0);
}

设置单元格内容、对齐、属性

通过 RowsCells 集合的索引器来访问和修改单元格。

// 设置第1行、第1列单元格的内容
dataGridView.Rows[0].Cells[0].Value = "白月黑羽-江老师";

// 也可以这样访问
dataGridView[0, 0].Value = "白月黑羽-江老师"; // [columnIndex, rowIndex]

// 设置单元格为只读
dataGridView[0, 0].ReadOnly = true;

// 设置单元格文本居中对齐
dataGridView[0, 0].Style.Alignment = DataGridViewContentAlignment.MiddleCenter;

获取单元格内容

同样通过索引器访问 Value 属性。

// 获取第1行、第1列单元格的文本
string text = dataGridView[0, 0].Value.ToString();

获取行数和列数

使用 RowCountColumnCount 属性。

int rowCount = dataGridView.RowCount;
int columnCount = dataGridView.ColumnCount;

获取当前选中行的索引

使用 CurrentCell 属性来定位当前单元格,然后获取其行索引。

int currentRowIndex = -1;
if (dataGridView.CurrentCell != null)
{
    currentRowIndex = dataGridView.CurrentCell.RowIndex;
}

清除所有内容

Rows.Clear() 方法可以清除所有行,但这只在非数据绑定模式下有效。

dataGridView.Rows.Clear();

设定列宽、宽度自动缩放

  • 固定列宽
// 设定第1列的宽度为 180 像素
dataGridView.Columns[0].Width = 180;
  • 自动缩放:通过设置列的 AutoSizeMode 属性。
// 让某一列填充剩余空间
dataGridView.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

您需要高效学习,找工作? 点击咨询 报名实战班

点击查看学员就业情况

设置数据源

可以给 设置数据源,实现数据和表格控件的双向绑定

比如

    public partial class Form1 : Form
    {
        // 定义 数据源字段
        public List<Product> products;

        public Form1()
        {
            InitializeComponent();

            // 创建数据源 数据
            products = new List<Product>()
            {
                new Product { 编号 = 101, 名称 = "笔记本电脑", 价格 = 7999.00m, 种类 = "电子产品" },
                new Product { 编号 = 102, 名称 = "C#入门经典", 价格 = 89.50m, 种类 = "图书音像" },
                new Product { 编号 = 103, 名称 = "智能台灯", 价格 = 299.00m, 种类 = "家居生活" },
                new Product { 编号 = 104, 名称 = "运动T恤", 价格 = 129.00m, 种类 = "服装鞋帽" }
            };
            // 绑定到表格控件的数据源
            dataGridView1.DataSource = products;
        }

        private void btnSave_Clicked(object sender, EventArgs e)
        {
            // products 内容放入字符串
            string productsText = string.Join("\n", products);
            // 写入文件 products.txt
            File.WriteAllText("products.txt", productsText);
        }
    }



    // 1. 定义实体类, 一定要放在表单定义的后面,
    // 因为Visual Studio 设计器认为第一个类定义用来作为界面编辑的
    public class Product
    {
        public int 编号 { get; set; }
        public required string 名称 { get; set; }
        public decimal 价格 { get; set; }
        public required string 种类 { get; set; }

        public override string ToString()
        {
            return $"编号: {编号}, 名称: {名称}, 价格: {价格}, 种类: {种类}";
        }
    }

事件:单元格内容改动

当用户修改了一个单元格的内容并结束编辑时,会触发 CellValueChanged 事件。

dataGridView.CellValueChanged += new DataGridViewCellEventHandler(HandleCellValueChanged);

private void HandleCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // e.RowIndex 和 e.ColumnIndex 提供了被修改单元格的位置
    if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
    {
        string newValue = dataGridView[e.ColumnIndex, e.RowIndex].Value.ToString();
        // 处理内容更改
    }
}