C# DataGridView 双向 绑定

本文介绍在Windows Forms中使用DataGridView进行数据绑定的方法,包括单向和双向绑定的不同方式及其效果对比,重点探讨了如何通过BindingList实现实时更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

自己学习记录。主要代码:

1、如何绑定到dgv

2、后台增加数据,dgv也变化

 

后来有研究,发现就算是直接用this.dataGridView1.DataSource = list1;

只要list1 是BindingList  类型,同样可以实现

1、前台数据变化,后台list变化,包括增加、删除、改变某个单元格值

2、后台list增加、删除,前台显示增加、删除。但是如果只是list中某个变量的值变化,必须要refresh才可以改变前台某个单元格值。这个在其他双向绑定中也有,不知道是不是我还没弄清楚。

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;


namespace WinFromBinding
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //绑定到非dataGridView中可以不用属性
        Person p = new Person();
        //双向绑定dataGridView必须是  属性  类型,字段无法绑定
        public  List<Person> list1 { get; set; }

        private void Form1_Load(object sender, EventArgs e)
        { 
            p.Name = "zhangsan";
            p.Age = 12;
            //textbox 的属性--数据源---数据源中的什么数据
            this.textBox1.DataBindings.Add("Text", p, "Name");

            list1 = new List<Person>()
            {
                new Person() { Name = "zhangsan", Age = 13 },
                new Person() { Name = "zhangsan", Age = 15 }
            };

            //1、单向绑定,dgv变化后,list1 不变化,要手动遍历dgv取得数据,麻烦
            //this.dataGridView1.DataSource = list1;

            //2、双向绑定  但不能增加、删除行
            //this.dataGridView1.DataBindings.Add("DataSource", this, "list1",
            //    false, DataSourceUpdateMode.OnPropertyChanged);

            //3、双向绑定,并且dgv 可以增加行、删除行
            //但是后台增加list数据后,dgv不增加显示
            //BindingSource bs = new BindingSource();
            //bs.DataSource = list1;
            //this.dataGridView1.DataSource = bs;


            //4、双向绑定,并且dgv 可以增加行、删除行
            //list1,要用BindingList 类型,不是list类型
            //后台增加list数据后,dgv  增加显示
            BindingSource bs = new BindingSource();
            bs.DataSource = list1;
            this.dataGridView1.DataSource = bs;


        }

        private void button1_Click(object sender, EventArgs e)
        {
            list1.Add(new Person() { Name = "zhangsan", Age = 15 });
            //如果list1 是list类型,后台增加,dgv不变
            //如果是BindingList 类型,后台增加,dgv变化
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

 

单向绑定和双向绑定的第一种方法,外观没有区别,

双向绑定的第二种方法外观上有区别,可以手动增加行,效果如下

 

 

另外 ,自己有个疑问,这3种绑定方式的效率排名如何?那种速度最快?

 

另,一个写的详细的:https://www.cnblogs.com/scy251147/archive/2011/10/23/2221991.html

<think>好的,我现在需要帮助用户解决如何在C#中将List绑定DataGridView的问题。用户之前可能遇到了绑定数据的问题,所以需要具体的示例代码和步骤。首先,我应该回忆一下DataGridView的数据绑定方法。 我记得在C#中,可以使用DataGridView的DataSource属性来绑定数据源。对于List这样的集合,可能需要确保列表中的元素是对象,并且有公开的属性,这样DataGridView才能自动生成列。如果是使用List<string>这样的简单类型,可能需要手动添加列,或者转换为对象列表。 用户提供的引用中有一个关于DataGridViewTextBoxColumn的例子,这可能涉及到手动添加列。但通常绑定List时,更推荐使用自动生成列的方式。所以应该先给出基本的绑定示例,比如设置DataSource为List,然后可能提到自动生成列的问题。 另外,用户提供的引用1中的代码是关于CellBeginEdit事件的处理,这可能和验证编辑条件有关,但用户当前的问题可能不需要这部分,不过可以暂时忽略,除非用户的问题涉及编辑时的验证。 接下来,我需要确保代码示例正确。例如,创建一个包含属性的类,然后创建该类的List,并将DataSource设置为这个List。可能需要提醒用户,如果使用自动生成列,应该在设置DataSource之前设置AutoGenerateColumns为true,或者手动调整列的顺序和格式。 另外,用户可能遇到绑定后数据不更新的情况,所以可能需要提到使用BindingList或实现INotifyPropertyChanged接口来支持双向绑定和实时更新。 然后,生成相关问题的时候,需要考虑用户接下来可能遇到的问题,比如如何刷新数据、如何自定义列、如何处理数据更新等。 现在整理步骤:首先创建数据模型类,然后创建List,绑定DataGridView。给出示例代码,说明自动生成列的情况,然后提供手动添加列的示例(参考用户提供的引用2中的代码)。最后提到双向绑定的方法。 需要检查是否有语法错误,比如是否正确使用DataSource赋值,是否处理了列的创建。同时,确保使用中文回答,并且LaTeX格式正确,但在这个问题中可能用不到数学公式,所以主要关注代码格式和结构。 可能的问题点:用户是否希望手动定义列,还是自动生成?示例应该覆盖这两种情况。另外,是否需要处理数据更新,比如添加或删除列表元素后的界面刷新。可能需要提到使用BindingList来解决这个问题。 现在,编写示例代码,首先自动绑定的例子,然后手动添加列的例子,引用用户提供的引用2中的代码作为参考。同时,说明如何实现双向绑定。 最后,生成相关问题,比如如何自定义列格式,如何实现双向绑定,如何处理大量数据等。</think>在C#中将List绑定DataGridView可通过以下步骤实现: ### 基础绑定方法 ```csharp // 创建数据模型类 public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } // 创建数据源并绑定 List<Product> products = new List<Product> { new Product{ Id=1, Name="鼠标", Price=99.9m }, new Product{ Id=2, Name="键盘", Price=199.0m } }; dataGridView1.AutoGenerateColumns = true; // 自动生成列(默认) dataGridView1.DataSource = products; ``` ### 手动配置列(推荐) ```csharp // 创建自定义列(参考引用[2]的列配置方法) dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Id", HeaderText = "产品ID", Width = 80 }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Name", HeaderText = "产品名称" }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Price", HeaderText = "价格", DefaultCellStyle = new DataGridViewCellStyle { Format = "C2" } }); dataGridView1.DataSource = products; ``` ### 双向绑定支持 ```csharp // 使用BindingList实现实时更新 BindingList<Product> bindingList = new BindingList<Product>(products); dataGridView1.DataSource = bindingList; // 添加新数据时会自动刷新 bindingList.Add(new Product{ Id=3, Name="显示器", Price=899.0m }); ``` ### 注意事项 1. 对象属性必须是`public`修饰 2. 修改列表数据后需要重置DataSource(非BindingList时) 3. 使用复杂类型时建议实现`INotifyPropertyChanged`接口[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值