开发者社区> 橘子红了呐> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C#编程-21:DataGridview清空数据
C#编程-21:DataGridview清空数据
26 0
c#winform中,对DataGridView数据进行操作,一次性保存
需求:不能每加一条数据就操作数据库,要完成所有的数据加入界面,点击保存时才一次性保存。 加载数据时,数据源上可以有数据,并可以在界面上对数据进行增加、修改、删除。
1140 0
3402
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载