首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
CSDN - 文档中心 - .NET 阅读:12230   评论: 0    参与评论
标题   DataGrid使用技巧(四)     选择自 dy_2000_abc 的 Blog
关键字   DataGrid,使用技巧
出处  

DataGrid使用技巧(四)

------------如何在DataGrid中显示来自不同DataTable的数据

       有时候听有些朋友抱怨.NET的DataGrid不是很好用。就我个人的体会,DataGrid的功能非常强大,可以使我们随心所欲的完成各种各样的工作,可惜就是实现起来不够简单明了。我对平时经常碰到的一些问题积累了一些解决的方法,现在把它们总结一下供大家参考。
       比较经常碰到的一个问题是:如何将来自不同DataTable的字段组合显示在DataGrid中?当然,可以将数据合并到一个DataTable中,但有时候由于其他限制不能将数据合并,下面提供了一种在DataGrid中显示来自不同DataTable(同在一个DataSet中)的数据的方法。

    数据在DataSet中的结构

    我们希望数据在DataGrid中如下图显示

    下面用一个例子说明如何实现将来自不同DataTable的数据显示在DataGrid中。

     基本思路:很显然,DataGrid不能同时绑定两个DataTable,那么,要使它显示两个不同DataTable的数据,就只有在DataGridColumn中下功夫了。以上面的结构为例,我们建立一个继承DataGridTextBoxColumn的类DataGridJoinColumn,重载GetColumnValueAtRow方法。这个类要实现的功能是:数据源是DataTable1,返回值是DataTable1.EmployeeID对应的DataTable2.LastName或DataTable2.FirstName。DataTable1.EmployeeID与DataTable2.EmployeeID是1对多联系,我们将这个联系添加到DataSet中,就可以通过GetParentRow(relation)方法取得DataTable1.EmployeeID对应的DataTable2.LastName和DataTable2.FirstName的值。具体代码如下:

     public class JoinTextBoxColumn : DataGridTextBoxColumn
     {
         string relation; //表示DataTable1.EmployeeID与DataTable2.EmployeeID的1对多联系
         DataColumn col; //表示返回DataTable2的列
         public JoinTextBoxColumn(string relation,DataColumn col )
         {
         this.relation=relation;
         this.col=col;
         base.ReadOnly=true;
         }
         protected override object GetColumnValueAtRow(CurrencyManager cm,int RowNum)
         {
             try
             {
              DataRow dr=((DataView)cm.List)[RowNum].Row;
              DataRow parentdr=dr.GetParentRow(relation);
              return parentdr[col]; //返回值是DataTable1.EmployeeID对应的LastName或FirstName
             }
             catch
             {
             return "";  //避免在添加新行时发生异常
             }
        }
        protected override bool Commit(CurrencyManager cm,int RowNum)
        {
            return false;
        }
        public new bool ReadOnly
       {
            get {return true;}
       }
   }

       下面的代码说明了如何使用类DataGridJoinColumn。新建一个Windows程序,加入一个DataGrid和一个SqlConnection,连接数据库NorthWind。 在Form_Load中加入下面代码:

     private void Form1_Load(object sender, System.EventArgs e)
     {
         SqlDataAdapter sda1=new SqlDataAdapter("select EmployeeID,LastName,FirstName from Employees",this.sqlConn);
         SqlDataAdapter sda3=new SqlDataAdapter("select OrderID,EmployeeID,OrderDate,RequiredDate from Orders",this.sqlConn);

         ds=new DataSet();
         sda1.Fill(ds,"emp");
         sda3.Fill(ds,"ord");

         ds.Relations.Add("ord_emp",ds.Tables["emp"].Columns["EmployeeID"],ds.Tables["ord"].Columns["EmployeeID"]);
   
         ds.Tables["ord"].Columns.Add("lastName",typeof(string));
         ds.Tables["ord"].Columns.Add("firstName",typeof(string));
   
         DataGridTableStyle dt=new DataGridTableStyle();
         DataGridColumnStyle dc;
           
        dc=new DataGridTextBoxColumn();
        dc.MappingName="OrderID";
        dc.HeaderText="OrderID";
        dt.GridColumnStyles.Add(dc);

        dc=new DataGridTextBoxColumn();
        dc.MappingName="EmployeeID";
        dc.HeaderText="EmployeeID";
        dt.GridColumnStyles.Add(dc);

        dc=new JoinTextBoxColumn("ord_emp",ds.Tables["emp"].Columns["firstName"]);
        dc.MappingName="firstName";
        dc.HeaderText="firstName";
        dt.GridColumnStyles.Add(dc);

        dc=new JoinTextBoxColumn("ord_emp",ds.Tables["emp"].Columns["lastName"]);
        dc.MappingName="lastName";
        dc.HeaderText="lastName";
        dt.GridColumnStyles.Add(dc);

        dc=new DataGridTextBoxColumn();
        dc.MappingName="OrderDate";
        dc.HeaderText="OrderDate";
        dt.GridColumnStyles.Add(dc);

        dc=new DataGridTextBoxColumn();
        dc.MappingName="RequiredDate";
        dc.HeaderText="RequiredDate";
        dt.GridColumnStyles.Add(dc);

        dt.MappingName="ord";
        this.dataGrid1.TableStyles.Add(dt);

        this.dataGrid1.DataSource=ds;
        this.dataGrid1.DataMember="ord";  
  }

 


相关文章
对该文的评论