0

0

C# WinForm数据绑定方法 C# WinForm如何实现数据绑定

幻夢星雲

幻夢星雲

发布时间:2026-01-25 07:01:19

|

615人浏览过

|

来源于php中文网

原创

WinForm数据绑定必须通过BindingSource中间层,它提供事件通知、排序筛选等功能;绑定需设DataSource和DataMember;双向同步依赖INotifyPropertyChanged接口实现;ComboBox需显式设置DisplayMember/ValueMember;Current属性用于获取当前选中项。

c# winform数据绑定方法 c# winform如何实现数据绑定

WinForm 的数据绑定不是“设个属性就自动同步”,它依赖 BindingSource 中间层和控件的 DataSource / DataMember 配合,直接绑 List 或 DataTable 行不通(除非控件原生支持且类型满足要求)。

BindingSource 是 WinForm 数据绑定的必经中间层

BindingSource 不只是“包装器”,它提供事件通知、排序、筛选、当前项管理等能力。没有它,很多控件(如 DataGridView、ComboBox)无法响应数据变化或无法正确显示编辑状态。

  • 绑定前必须先将数据源(如 ListDataTable)赋给 BindingSource.DataSource
  • 若数据源是集合且含嵌套属性(如 Orders[0].ProductName),需用 DataMember 指定路径,否则默认只读第一层
  • 绑定到 TextBox 等单值控件时,DataMember 填字段名(如 "Name");绑定到 DataGridView 时通常留空,由列的 DataPropertyName 分别指定
var bs = new BindingSource();
bs.DataSource = new List { new Person { Name = "张三", Age = 28 } };
textBox1.DataBindings.Add("Text", bs, "Name"); // 此处 "Name" 是 Person 的属性名
dataGridView1.DataSource = bs; // 自动映射所有 public 属性

INotifyPropertyChanged 是实现双向实时更新的关键接口

BindingSource 默认不监听对象属性变更,除非你手动调用 ResetBindings()。要让 TextBox 编辑后自动更新对象、对象属性变化后自动刷新 UI,必须让数据类实现 INotifyPropertyChanged

通义灵码
通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

下载
  • 没实现该接口 → 修改 TextBox 内容不会写回对象;修改对象属性也不会触发 UI 更新
  • 即使用了 BindingSource,若数据类是普通 class(非 ObservableCollection 或 DataTable),不实现该接口就只有“单向初始化”效果
  • VS 支持快速生成该接口模板(右键类 → “实现接口” → 选 INotifyPropertyChanged)
public class Person : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get => _name;
        set { _name = value; OnPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

ComboBox 和 ListBox 绑定时容易忽略 DisplayMember/ValueMember

直接绑 List 到 ComboBox,它会显示 ToString() 结果(通常是类型名),这不是 bug,是默认行为。必须显式设置 DisplayMemberValueMember 才能按需展示和取值。

  • DisplayMember:决定下拉列表中显示哪一列(对应对象属性名)
  • ValueMember:决定 SelectedValue 返回什么(常用于主键 ID)
  • 如果只设 DisplayMember 没设 ValueMemberSelectedValue 将返回整个对象,容易引发类型转换错误
comboBox1.DataSource = bs;
comboBox1.DisplayMember = "Name";   // 显示姓名
comboBox1.ValueMember = "Id";       // 取值时返回 Id 字段

BindingSource 的 Current 属性常被忽略——它才是当前选中行的实时引用。很多逻辑(比如点击按钮保存当前编辑行)应该从 bs.Current as Person 获取,而不是从原始 List 里按索引硬取,否则可能和 UI 当前状态不一致。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1072

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

925

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

468

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

299

2025.07.15

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

42

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

46

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.5万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号