C# DataGridView绑定数据源的几种常见方式

简介:

 开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定。

1. 简单的数据绑定

例1

复制代码
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ToString())) 
{  

  SqlDataAdapter sda = new SqlDataAdapter("Select * From T_Class Where F_Type='Product' order by F_RootID,F_Orders", conn); 
  DataSet Ds = new DataSet(); 
  sda.Fill(Ds, "T_Class"); 

  //使用DataSet绑定时,必须同时指明DateMember 
  this.dataGridView1.DataSource = Ds; 
  this.dataGridView1.DataMember = "T_Class"; 

  //也可以直接用DataTable来绑定 
  this.dataGridView1.DataSource = Ds.Tables["T_Class"]; 
} 
复制代码

  简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性

  采用如下形式进行绑定:引用控件.DataBindings.Add("控件属性", 实例对象, "属性名", true); 

 

 例2

  从数据库中把数据读出来放到一个数据集中,比如List<>、DataTable,DataSet,我一般用List<>,
  然后绑定数据源:

IList sList=StudentDB.GetAllList();
DataGridView.DataSource=sList;

 

  如果你没有设置DataGridView的列,它会自动生成所有列。

2. 复杂数据绑定 


  复杂的数据绑定是将一个以列表为基础的用户控件(例如:ComboBox、ListBox、ErrorProvider、DataGridView等控件)绑定至一个数据对象的列表。 
  基本上,Windows Forms的复杂数据绑定允许绑定至支持IList接口的数据列表。此外,如果想通过一个BindingSource组件进行绑定,还可以绑定至一个支持IEnumerable接口的数据列表。 
  对于复杂数据绑定,常用的数据源类型有(代码以DataGridView作为示例控件)。

复制代码
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Collections; 

namespace DataGridViewBindingData 
{ 
public partial class Form1 : Form 
{ 

public Form1() {   InitializeComponent(); } private void button1_Click(object sender, EventArgs e) {   //this.dataGridView1.DataSource = DataBindingByList1();   //this.dataGridView1.DataSource = DataBindingByList2();   //this.dataGridView1.DataSource = DataBindingByDataTable();   this.dataGridView1.DataSource = DataBindingByBindingSource(); } /// /// IList接口(包括一维数组,ArrayList等) /// /// private ArrayList DataBindingByList1() {   ArrayList Al = new ArrayList();   Al.Add(new PersonInfo("a","-1"));   Al.Add(new PersonInfo("b","-2"));   Al.Add(new PersonInfo("c","-3"));   return Al; } /// /// IList接口(包括一维数组,ArrayList等) /// /// private ArrayList DataBindingByList2() {   ArrayList list = new ArrayList();   for (int i = 0; i < 10; i++)   {     list.Add(new DictionaryEntry(i.ToString(),i.ToString()+"_List"));   }   return list; } /// /// IListSource接口(DataTable、DataSet等) /// /// private DataTable DataBindingByDataTable() {   DataTable dt = new DataTable();   DataColumn dc1 = new DataColumn("Name");   DataColumn dc2 = new DataColumn("Value");   dt.Columns.Add(dc1);   dt.Columns.Add(dc2);   for (int i = 1; i <= 10; i++)   {     DataRow dr = dt.NewRow();     dr[0] = i;     dr[1] = i.ToString() + "_DataTable";     dt.Rows.Add(dr);   }   return dt; } /// /// IBindingListView接口(如BindingSource类) /// /// private BindingSource DataBindingByBindingSource() {   Dictionary<string, string> dic = new Dictionary<string, string>();   for (int i = 0; i < 10; i++)   {     dic.Add(i.ToString(),i.ToString()+"_Dictionary");   }   return new BindingSource(dic,null);
}
} }
复制代码

  

  上面代码中BindingSource的Datasource是一个结构类型DictionaryEntry,同样的DictionaryEntry并不能直接赋值给Combobox的DataSource,但通过BindingSource仍然可以间接实现。 这是因为: 
BindingSource可以作为一个强类型的数据源。其数据源的类型通过以下机制之一固定。使用 Add 方法可将某项添加到 BindingSource 组件中。 
将 DataSource 属性设置为一个列表、单个对象或类型。(这三者并不一定要实现IList或IListSource) 
这两种机制都创建一个强类型列表。BindingSource 支持由其 DataSource 和 DataMember 属性指示的简单数据绑定和复杂数据绑定。

 

总结:

根据DataSource绑定的对象的不同,可以有一下几种简单的绑定:

复制代码
// DataSet 、DataTable

// 方式1
DataSet ds=new DataSet (); this.dataGridView1.DataSource=ds.Table[0]; this.dataGridView1.DataSource = ds.Tables["表名"]; // 方式2 DataTable dt=new DataTable(); this.dataGridView1.DataSource=dt; // DataView DataView dv = new DataView(); this.dataGridView1.DataSource = dv; // 设置了DataMember DataSet ds=new DataSet (); this.dataGridView1.DataSource = ds; this.dataGridView1.DataMember = "表名"; // ArrayList ArrayList Al = new ArrayList(); this.dataGridView1.DataSource = Al; // dic Dictionary<string, string> dic = new Dictionary<string, string>(); this.dataGridView1.DataSource = dic; // List this.dataGridVi.DataSource = new BindingList(List); 
                                                               
复制代码

 

3. 实例

3.1 手动给dataGridView绑定数据源的方法

c#中手动给dataGridView绑定数据源,能够很自由地进行操作,但展示数据并没有C#自动添加数据源那么方便。可有时为了方便操作数据,我们更愿意手动连接数据源,代码如下:

复制代码
conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Restaurant.mdb");//建立数据库连接  
cmd = new OleDbCommand("select * from data", conn);//执行数据连接  
DataSet ds = new DataSet();  
OleDbDataAdapter da = new OleDbDataAdapter(cmd);  
da.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];//数据源 this.dataGridView1.AutoGenerateColumns = false;//不自动 conn.Close();//关闭数据库连接
复制代码

说明:

解决DataGridView绑定了数据源无法更新保存当前行的问题

this.dataGridView.currentCell=null;//该行的作用是取消datagridview行的编辑状态  
adapter.Update(userTable);  

3.2 利用泛型集合向DataGridView中添加数据

List<>泛型集合

复制代码
private void Form1_Load(object sender, EventArgs e)  
{  
    //使用List<>泛型集合填充DataGridView  
    List students = new List();  
    Student hat = new Student("Hathaway", "12", "Male");  
    Student peter = new Student("Peter","14","Male");  
    Student dell = new Student("Dell","16","Male");  
    Student anne = new Student("Anne","19","Female");  
    students.Add(hat);  
    students.Add(peter);  
    students.Add(dell);  
    students.Add(anne);  
    this.dataGridView1.DataSource = students;  
}
复制代码

Dictionary<>泛型集合

复制代码
private void Form1_Load(object sender, EventArgs e)  
{  
    //使用Dictionary<>泛型集合填充DataGridView  
    Dictionary students = new Dictionary();  
    Student hat = new Student("Hathaway", "12", "Male");  
    Student peter = new Student("Peter","14","Male");  
    Student dell = new Student("Dell","16","Male");  
    Student anne = new Student("Anne","19","Female");  
    students.Add(hat.StuName,hat);  
    students.Add(peter.StuName,peter);  
    students.Add(dell.StuName,dell);  
    students.Add(anne.StuName,anne);  
         //在这里必须创建一个BindIngSource对象,用该对象接收Dictionary<>泛型集合的对象  
    BindingSource bs = new BindingSource();  
         //将泛型集合对象的值赋给BindingSourc对象的数据源  
    bs.DataSource = students.Values;  
    this.dataGridView1.DataSource = bs;  
}
复制代码

3.3 利用SqlDataReader填充DataGridView 

复制代码
//使用SqlDataReader填充DataGridView  
using (SqlCommand command = new SqlCommand("select * from product", DBService.Conn))  
{  
      SqlDataReader dr = command.ExecuteReader();  
      BindingSource bs = new BindingSource();  
      bs.DataSource = dr;  
      this.dataGridView1.DataSource = bs;  
}
复制代码

3.4 利用SqlDataAdapter对象向DataGridView中添加数据 

复制代码
using (SqlDataAdapter da = new SqlDataAdapter("select * from Product", DBService.Conn))  
{  
      DataSet ds = new DataSet();  
      da.Fill(ds);  
      this.dataGridView1.DataSource = ds.Tables[0];  
}
复制代码

 

参考文章

1. 小白datagridview绑定数据源的几种常见方式

2. aspnet2005, 在C#中DataGridView控件怎么绑定数据库的数据?

3. officialxiofe,  C#中DataGridView控件绑定数据源有几种方式?

4. lllljz, c#中手动给dataGridView绑定数据源的方法.

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5943850.html,如需转载请自行联系原作者



相关文章
|
C# 数据库
C# DataGridView用法(—)代码绑定数据源
C# DataGridView用法(—)代码绑定数据源
457 1
|
1月前
|
SQL 开发框架 .NET
C#一分钟浅谈:数据绑定与数据源控件
在Web开发中,数据绑定和数据源控件是实现动态网页的关键技术。本文从基础概念入手,详细讲解数据绑定的原理及其在ASP.NET中的应用,并介绍常见数据绑定方式:手动绑定和自动绑定。接着,文章重点介绍了ASP.NET中的数据源控件,如`SqlDataSource`、`ObjectDataSource`、`XmlDataSource`和`LinqDataSource`,并通过具体示例演示如何使用`SqlDataSource`和`GridView`进行数据绑定。最后,还列举了一些常见问题及其解决办法,帮助读者更好地理解和应用这些技术。
66 4
|
6月前
|
存储 缓存 C#
46.c#:datagridview控件
46.c#:datagridview控件
92 1
|
6月前
|
SQL 数据库连接 数据库
C# | 将DataGridView中的数据保存到Accesss数据库
要将WinForm的DataGridView中的数据保存到Access数据库,可以按照本文的步骤进行。 在Visual Studio中,打开项目,右键单击“引用”文件夹,选择“添加引用”,在“COM”选项卡中找到并选中“Microsoft Office 14.0 Access Database Engine Object Library”,然后单击“确定”按钮。
297 0
C# | 将DataGridView中的数据保存到Accesss数据库
|
6月前
|
XML 存储 JSON
C# | DataGridView数据转存为Json、XML格式
DataGridView是常用的数据展示组件,而将其转存为Json或XML格式,则可以方便地进行数据的传输和存储。 Json格式具有轻量、易读、易解析等优点,广泛应用于Web开发、API接口传输等场景。 XML格式则具有良好的结构化特性,支持命名空间、数据类型等复杂数据表示方式,被广泛应用于数据交换、配置文件等领域。 因此,将DataGridView数据转存为Json、XML格式,不仅能够方便地进行数据的传输和存储,还能够满足不同场景下的数据需求。 本篇文章将介绍如何将DataGridView数据转存为Json、XML格式,并提供相应的代码示例。
226 0
C# | DataGridView数据转存为Json、XML格式
|
6月前
|
JSON C# 数据格式
C# | 使用DataGridView展示JSON数组
你想展示一个复杂的JSON数组数据吗?但是你却不知道该如何展示它,是吗?没问题,因为本文就是为解决这个问题而生的!使用DataGridView轻松地将JSON数组数据以表格的形式呈现出来,这样你就可以更加清晰地了解和处理数据了。 让我们一起来探索如何实现吧!
183 0
C# | 使用DataGridView展示JSON数组
|
6月前
|
XML JSON 数据处理
C# | 导出DataGridView中的数据到Excel、CSV、TXT
从DataGridView中导出数据到Excel、CSV、TXT是开发中非常常见的一种需求。本文将讲解如何高效的完成对这三种格式的单向导出。 倘若直接写三种格式的导出必定会产生大量的重复代码,而从表中获取结构化数据的思路是基本一致的,因此有一个思路是先将DataGridView中的数据转换为DataTable对象,再进一步导出成我们的目标格式。 本文将介绍如何将DataGridView中的数据转换为DataTable格式,并提供将DataTable转换为Excel、CSV、TXT三种格式的例子。
561 0
C# | 导出DataGridView中的数据到Excel、CSV、TXT
|
C#
C#之四十三 从DataGridView导出数据到Excel
C#之四十三 从DataGridView导出数据到Excel
93 0
|
22天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
30 3
|
2月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
45 2