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<student> 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(); } /// <summary> /// IList接口(包括一维数组,ArrayList等) /// </summary> /// <returns></returns> 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; } /// <summary> /// IList接口(包括一维数组,ArrayList等) /// </summary> /// <returns></returns> 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; } /// <summary> /// IListSource接口(DataTable、DataSet等) /// </summary> /// <returns></returns> 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; } /// <summary> /// IBindingListView接口(如BindingSource类) /// </summary> /// <returns></returns> 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<Object> this.dataGridVi.DataSource = new BindingList<Object>(List<Object>);
复制代码

 

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<Student> students = new List<Student>();  
    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<String, Student> students = new Dictionary<String, Student>();  
    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,如需转载请自行联系原作者



相关文章
|
10月前
|
C# 数据库
C# DataGridView用法(—)代码绑定数据源
C# DataGridView用法(—)代码绑定数据源
395 1
|
7天前
|
存储 缓存 C#
46.c#:datagridview控件
46.c#:datagridview控件
27 1
|
7天前
|
SQL 数据库连接 数据库
C# | 将DataGridView中的数据保存到Accesss数据库
要将WinForm的DataGridView中的数据保存到Access数据库,可以按照本文的步骤进行。 在Visual Studio中,打开项目,右键单击“引用”文件夹,选择“添加引用”,在“COM”选项卡中找到并选中“Microsoft Office 14.0 Access Database Engine Object Library”,然后单击“确定”按钮。
106 0
C# | 将DataGridView中的数据保存到Accesss数据库
|
7天前
|
XML 存储 JSON
C# | DataGridView数据转存为Json、XML格式
DataGridView是常用的数据展示组件,而将其转存为Json或XML格式,则可以方便地进行数据的传输和存储。 Json格式具有轻量、易读、易解析等优点,广泛应用于Web开发、API接口传输等场景。 XML格式则具有良好的结构化特性,支持命名空间、数据类型等复杂数据表示方式,被广泛应用于数据交换、配置文件等领域。 因此,将DataGridView数据转存为Json、XML格式,不仅能够方便地进行数据的传输和存储,还能够满足不同场景下的数据需求。 本篇文章将介绍如何将DataGridView数据转存为Json、XML格式,并提供相应的代码示例。
115 0
C# | DataGridView数据转存为Json、XML格式
|
7天前
|
JSON C# 数据格式
C# | 使用DataGridView展示JSON数组
你想展示一个复杂的JSON数组数据吗?但是你却不知道该如何展示它,是吗?没问题,因为本文就是为解决这个问题而生的!使用DataGridView轻松地将JSON数组数据以表格的形式呈现出来,这样你就可以更加清晰地了解和处理数据了。 让我们一起来探索如何实现吧!
84 0
C# | 使用DataGridView展示JSON数组
|
7天前
|
XML JSON 数据处理
C# | 导出DataGridView中的数据到Excel、CSV、TXT
从DataGridView中导出数据到Excel、CSV、TXT是开发中非常常见的一种需求。本文将讲解如何高效的完成对这三种格式的单向导出。 倘若直接写三种格式的导出必定会产生大量的重复代码,而从表中获取结构化数据的思路是基本一致的,因此有一个思路是先将DataGridView中的数据转换为DataTable对象,再进一步导出成我们的目标格式。 本文将介绍如何将DataGridView中的数据转换为DataTable格式,并提供将DataTable转换为Excel、CSV、TXT三种格式的例子。
145 0
C# | 导出DataGridView中的数据到Excel、CSV、TXT
|
7月前
|
C#
C#之四十三 从DataGridView导出数据到Excel
C#之四十三 从DataGridView导出数据到Excel
68 0
|
10月前
|
C# 数据库
C#中的DataGridView中添加按钮并操作数据
C#中的DataGridView中添加按钮并操作数据
214 0
|
10月前
|
C#
C# 两个DataGridView设置时间范围,开始日期小于结束日期
C# 两个DataGridView设置时间范围,开始日期小于结束日期
67 0
|
数据库 C#
C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作
C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作
C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作