C# WinForm BindingSource 组件基础操作与 DBNull 绑定实例

拾光
拾光
发布时间:2026-10-14| 5人浏览过
原创

BindingSource 是 C# WinForm 开发中用于连接控件与数据源的关键组件。它不仅作为控件绑定的中间层以简化导航、排序和筛选操作,还可用作强类型集合。本文将通过两个实例演示其基础的增删改查操作,以及如何配置 NullValue 属性来优雅地处理数据库中的 DBNull 值。

结果与目标

掌握 BindingSource 组件的两种主要用途:
1. 作为 Windows 窗体控件与数据之间的间接层,统一处理导航、排序、筛选和更新。
2. 充当强类型数据源,通过 Add 方法管理特定类型的列表。

准备条件

  1. 开发环境:Visual Studio,新建一个 C# Windows Forms 项目。
  2. 界面控件:拖入 DataGridView(用于显示数据)、多个 Button(触发操作)以及必要的文本框或图片框(用于 DBNull 示例)。
  3. 数据模型:定义一个公开的类 Custom,包含 ID 和 Name 属性,注意属性必须公开(public),以便 BindingSource 进行反射访问。

真实操作顺序

第1步:初始化与绑定数据源

目的:建立 BindingSource 与界面控件的连接。
入口:Form_Load 事件。
动作:

// 创建实例
private BindingSource source = new BindingSource();

// 在窗体加载事件中
private void Form1_Load(object sender, EventArgs e)
{
    // 将 DataSource 设置为自定义类型,BindingSource 会自动创建一个该类型的列表
    this.source.DataSource = typeof(Custom);
    // 将 DataGridView 的数据源指向 BindingSource
    this.dataGridView1.DataSource = this.source;
}

完成状态:运行程序,DataGridView 应显示 ID 和 Name 两列,此时列表中为空。

第2步:执行数据的增加(Add)

目的:向当前绑定列表中添加新记录。
入口:添加按钮 Click 事件。
动作调用 Add 方法创建新对象并加入列表:

private void button1_Click(object sender, EventArgs e)
{
    this.source.Add(new Custom(1, "A"));
    this.source.Add(new Custom(2, "B"));
}

完成状态:DataGridView 中新增了两行数据。

第3步:执行数据的删除(Remove/RemoveAt)

目的:移除指定索引项或当前选中项。
入口:删除按钮 Click 事件。
动作:

// 按索引删除,移除第一项
private void button2_Click(object sender, EventArgs e)
{
    this.source.RemoveAt(0);
}

// 按对象删除,移除当前项
private void button8_Click(object sender, EventArgs e)
{
    Custom custom = (Custom)this.source.Current;
    this.source.Remove(custom);
}

完成状态:对应行从 DataGridView 中消失。

第4步:执行数据的排序与筛选(Sort & Filter)

目的:对数据进行可视化的逻辑处理,不影响底层原始数据。
入口:排序/筛选按钮 Click 事件。
参数说明:
- Sort:使用类似 SQL 的字符串表达式,如 "ID ASC" 或 "Name DESC"。
- Filter:使用列名和值的表达式,如 "ID = 1"。

// 排序
private void button3_Click(object sender, EventArgs e)
{
    this.source.Sort = "ID ASC";
    this.source.ResetBindings(false);
}

// 筛选
private void button4_Click(object sender, EventArgs e)
{
    this.source.Filter = "ID = 1";
    this.source.ResetBindings(false);
}

注意:部分旧版文档建议使用 ResetBindings(false) 刷新显示,但在现代 .NET 环境中,修改 Sort/Filter 后通常自动刷新。若发现视图未更新,可调用此方法强制通知绑定控件。

第5步:数据的导航与定位

目的:控制当前光标位置,获取或修改当前项。
入口:移动按钮或获取信息按钮 Click 事件。
动作:

// 向下移动一位
private void button5_Click(object sender, EventArgs e)
{
    this.source.MoveNext();
    MessageBox.Show("当前位置: " + this.source.Position.ToString());
}

// 向上移动一位
private void button9_Click(object sender, EventArgs e)
{
    this.source.MovePrevious();
    MessageBox.Show("当前位置: " + this.source.Position.ToString());
}

// 获取当前项详情
private void button6_Click(object sender, EventArgs e)
{
    if (this.source.Current != null)
    {
        Custom custom = (Custom)this.source.Current;
        MessageBox.Show("所处位置 : " + this.source.IndexOf(custom).ToString());
        MessageBox.Show("custom.Name : " + custom.Name);
    }
}

完成状态:弹出消息框显示当前行的索引和属性值。

第6步:修改当前项数据

目的:就地修改当前绑定对象的属性。
入口:修改按钮 Click 事件。
动作:

private void button7_Click(object sender, EventArgs e)
{
    Custom custom = (Custom)this.source.Current;
    if (custom != null)
    {
        custom.Name = "修改后的值";
        // 通知绑定源当前项已更改,确保 UI 刷新
        this.source.ResetCurrentItem();
    }
}

DBNull 值的绑定处理

当数据源(如 DataTable 来自数据库)包含 NULL 值时,直接绑定可能导致异常或空白显示。BindingSource 支持设置 NullValue 来指定默认替代值。

第7步:配置字符串类型的 NullValue

目的:当数据库字段为 NULL 时,文本框显示自定义文本而非空白。
动作:在创建 Binding 时或通过 Binding 对象设置 NullValue。

// 假设 textBox2 绑定到 ReportsTo 列
Binding reportsToBinding = textBox2.DataBindings.Add("Text", bindingSource1, "ReportsTo", true);
// 设置当值为 DBNull 时显示的文本
reportsToBinding.NullValue = "No Manager";

第8步:配置图像类型的 NullValue

目的:当图片路径或二进制数据为 NULL 时,显示占位图,防止报错。
动作:在 DataBindings.Add 方法中传入第四个参数作为 NullValue。

// PictureBox 绑定 Photo 列,若无图片则显示 Button.bmp
pictureBox1.DataBindings.Add("Image", bindingSource1, "Photo", true,
    DataSourceUpdateMode.Never, new Bitmap(typeof(Button), "Button.bmp"));

补充说明
在实际数据库场景中(如 Northwind 示例),需先建立连接并填充 DataTable:
1. 构建连接字符串(如 Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=localhost)。
2. 使用 SqIDataAdapter 填充 DataTable。
3. 将 bindingSource1.DataSource 设置为该 DataTable。

简要总结

BindingSource 通过封装复杂的数据交互逻辑,极大简化了 WinForm 中的数据绑定开发。开发者只需关注 Add, Remove, Sort, Filter 等高级接口,无需手动维护 DataGridView 的行集合。同时,合理利用 NullValue 属性可以有效提升应用在处理空值数据时的健壮性。以上就是 C# WinForm BindingSource 组件基础操作与 DBNull 绑定的详细内容,更多关于 C# 数据绑定技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。