首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题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)    

积极原创作者 
tellmenow (22)
cutemouse (22)
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
CSDN - 文档中心 - .NET 阅读:4880   评论: 5    参与评论
标题   将OleDbDataAdapter绑定到Winform下的DataGrid     选择自 SaSBYa 的 Blog
关键字   DataGrid DataAdapter 绑定
出处  

       将OleDbDataAdapter绑定到Winform下的DataGrid,这个说法是不是有点奇怪:不妨看看,偶用了一个晚上写出来的,写的不好大家见谅。

       当然,有了这样的一种绑定方法,那么同样我们还可以继承出绑定SqlDataAdapter的DataGrid .大家不妨试一试,偶写的不好,就当抛砖引玉。

相关的属性方法和事件:

    CustomDataGrid 实例化一个新的CustomDataGrid控件,用于OleDB
  
    CustomDataGrid 实例化一个新的CustomDataGrid控件,用于OleDB
  
   DataGridOleDbDataAdapter 给CustomDataGrid控件赋值新的OleDbDataAdapter
  
    FillDataSetAndBindAfterBindOleDBDataAdapter CustomDataGrid的BindOleDbDataAdapter传入新值后是否显示新的数据
  
    DataBind CustomDataGrid对OleDBDataAdapter的绑定
  
    Update 提交所有更改
  
    CancelUpdate 放弃所有更改
  
    DeleteRows 删除所有选择项(删除不影响原始数据,必需更新数据库后才发生)
  
    EnableSelect 是否允许多选(同删除有关,同界面有关)
  
    constructDataGridDisplayStyles 根据DataSet数据类型创建数据显示方式
  
    AddSelectRow 增加新列,用于选择
  
    TableTittle 属性 对应表的标题 

 

 

 

 

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace Forward.WinUI
{
 /// <summary>
 /// CustomDataGrid 的摘要说明。
 /// </summary>
 public class CustomDataGrid : System.Windows.Forms.DataGrid
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

  //这是本模块绑定的OleDbDataAdapter
  private System.Data.OleDb.OleDbDataAdapter BindOleDbDataAdapter;

  
  // 这是本DataGrid内含的DataSet对象
  private System.Data.DataSet ContentDataSet;

  //CustomDataGrid的BindOleDbDataAdapter传入新值后是否显示新的数据
  private bool FillAfterBindADP;

  //允许进行多行选择
  private bool EnableMultiSelect;

  //每列标题名
  private string[] tittleName;
  /// <summary>
  /// 实例化一个新的CustomDataGrid控件,用于OleDB
  /// </summary>
  public CustomDataGrid()
  {
   // 该调用是 Windows.Forms 窗体设计器所必需的。
   InitializeComponent();

   // TODO: 在 InitializeComponent 调用后添加任何初始化
  }

  /// <summary>
  /// 实例化一个新的CustomDataGrid控件,用于OleDB
  /// </summary>
  /// <param name="BindOleDbAdp">传入的OleDbDataAdapter</param>
  public CustomDataGrid(System.Data.OleDb.OleDbDataAdapter BindOleDbAdp)
  {
   // 该调用是 Windows.Forms 窗体设计器所必需的。
   InitializeComponent();

   // TODO: 在 InitializeComponent 调用后添加任何初始化
   BindOleDbAdp=this.DataGridOleDbDataAdapter ;
  }


  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if( components != null )
     components.Dispose();
   }
   base.Dispose( disposing );
  }

  #region Component Designer generated code
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器
  /// 修改此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   components = new System.ComponentModel.Container();
   this.ContentDataSet=new System.Data.DataSet();
   tittleName=null;
  }
  #endregion

  #region 给CustomDataGrid控件赋值新的OleDbDataAdapter
  /// <summary>
  /// 给CustomDataGrid控件赋值新的OleDbDataAdapter
  /// </summary>
  public System.Data.OleDb.OleDbDataAdapter DataGridOleDbDataAdapter
  {
   get
   {
    return this.BindOleDbDataAdapter ;
   }
   set
   {
    BindOleDbDataAdapter=value;
    
    //是否填充数据集并显示
    if (FillAfterBindADP)
    {
     DataBind();    
    }
   }

  }
  #endregion

  #region FillDataSetAndBindAfterBindOleDBDataAdapter  CustomDataGrid的BindOleDbDataAdapter传入新值后是否显示新的数据
  /// <summary>
  /// CustomDataGrid的BindOleDbDataAdapter传入新值后是否显示新的数据
  /// </summary>
  public bool FillDataSetAndBindAfterBindOleDBDataAdapter
  {
   get
   {
    return FillAfterBindADP;
   }
   set
   {
    FillAfterBindADP=value;
   }
  }
  #endregion

  #region DataBind CustomDataGrid对OleDBDataAdapter的绑定
  /// <summary>
  /// CustomDataGrid对OleDBDataAdapter的绑定
  /// </summary>
  public void DataBind()
  {
   if (this.BindOleDbDataAdapter!=null)
   {
    this.ContentDataSet.Tables.Clear();
    BindOleDbDataAdapter.Fill(this.ContentDataSet );
    this.DataSource=null;
    constructDataGridDisplayStyles();
    this.DataSource=this.ContentDataSet.Tables[0]; 
   }
   
  }
  #endregion

  #region Update 提交所有更改
  /// <summary>
  /// 提交所有更改
  /// </summary>
  public  new void Update()
  {
   if (BindOleDbDataAdapter!=null)
   {
    if (this.ContentDataSet.Tables[0]!=null)
    {
     try
     {

      BindOleDbDataAdapter.Update(((System.Data.DataTable)this.DataSource));
     }
     catch (System.Exception ex)
     {
      MessageBox.Show(this,ex.Message.ToString());

     }
     finally
     {

     }
    }
   }
  }
  #endregion

  #region CancelUpdate 放弃所有更改
  /// <summary>
  /// 放弃所有更改
  /// </summary>
  public void CancelUpdate()
  {
   DataBind();
  }
  #endregion

  #region Delete 删除所有选择项
  /// <summary>
  /// 删除所有选择项(删除不影响原始数据,必需更新数据库后才发生)
  /// </summary>
  public void DeleteRows()
  {
   if(EnableMultiSelect)
   {
    if (this.BindOleDbDataAdapter!=null)
    {

     int i=0;
     bool[] row;
     row=new bool[((System.Data.DataTable)this.DataSource).Rows.Count];
     foreach(DataRow dr in ((System.Data.DataTable)this.DataSource).Rows)
     {
      if (Convert.ToBoolean(dr["Select"]))
      {
       row[i]=true;
      }
      else
      {
       row[i]=false;
      }
      i++;
     }

     for(i=((System.Data.DataTable)this.DataSource).Rows.Count-1;i>=0;i--)
     {
      if (Convert.ToBoolean(row[i]))
      { 
       ((System.Data.DataTable)this.DataSource).Rows[i].Delete();
       //                            ((System.Data.DataTable)this.DataSource).Rows.RemoveAt(i);
      }
     
     }
                         
    }

   }

  }
  #endregion

  #region EnableSelect 是否允许多选(同删除有关,同界面有关)
  /// <summary>
  /// 是否允许多选(同删除有关,同界面有关)
  /// </summary>
  public bool EnableSelect
  {
   get
   {
    return EnableMultiSelect;
   }
   set
   {
    EnableMultiSelect=value;
   }
  }
  #endregion

  #region constructDataGridDisplayStyles 根据DataSet数据类型创建数据显示方式
  /// <summary>
  /// 根据DataSet数据类型创建数据显示方式
  /// </summary>
  private void constructDataGridDisplayStyles()
  {
   if (this.ContentDataSet.Tables[0]!=null)
   {
    System.Windows.Forms.DataGridColumnStyle[] tempDGCS;

    int count;
    int currCount=0;

    if(EnableMultiSelect)
    {
     count=this.ContentDataSet.Tables[0].Columns.Count +1;
    }
    else
    {
     count=this.ContentDataSet.Tables[0].Columns.Count;
    }

    if(EnableMultiSelect)
    {
     AddSelectRow();
    }

    tempDGCS=new System.Windows.Forms.DataGridColumnStyle[count];

    if(EnableMultiSelect)
    {
     tempDGCS[0]=new System.Windows.Forms.DataGridBoolColumn();
     tempDGCS[0].HeaderText="Select";
     tempDGCS[0].Width=80;
    }
    foreach(DataColumn dc in this.ContentDataSet.Tables[0].Columns)
    {
     switch(dc.DataType.ToString())
     {
      case "System.Boolean":
       tempDGCS[currCount]=new System.Windows.Forms.DataGridBoolColumn();
       tempDGCS[currCount].MappingName=dc.ColumnName ;
       break;
      default:
       tempDGCS[currCount]=new System.Windows.Forms.DataGridTextBoxColumn();
       tempDGCS[currCount].MappingName=dc.ColumnName ;
       break;
     }
     currCount++;

    }

    System.Windows.Forms.DataGridTableStyle tempDGTS=new DataGridTableStyle();

    //这是用于加入用于做选择的新列
    if(this.EnableMultiSelect)
    {
     tempDGTS.GridColumnStyles.Add(tempDGCS[count-1]);
    }
    int j;
    j=0;
    if(this.EnableMultiSelect)
    {
     j=count-1;
    }
    else
    {
     j=count;
    }

    for(int i=0 ;i<j;i++)
    {
     tempDGTS.GridColumnStyles.Add(tempDGCS[i]);
    }
    for(int i=0;i<tempDGTS.GridColumnStyles.Count;i++)
    {
     if (tittleName!=null)
     {
      if (tittleName.Length>=i)
      {
       tempDGTS.GridColumnStyles[i].HeaderText=tittleName[i] ;
      }
     }
     
    }

    this.TableStyles.Clear();
    tempDGTS.MappingName=this.ContentDataSet.Tables[0].TableName ;
    this.TableStyles.Add(tempDGTS);
    tempDGTS.Dispose();
   
    
   }
  }
  #endregion

  /// <summary>
  /// 增加新列,用于选择
  /// </summary>
  private void AddSelectRow()
  {
   DataColumn dc=new DataColumn("Select",System.Type.GetType("System.Boolean"));
   dc.DefaultValue=false;
   this.ContentDataSet.Tables[0].Columns.Add(dc);
   
  }

  /// <summary>
  /// 属性 对应表的标题
  /// </summary>
  public string[] TableTittle
  {
   get
   {
    return tittleName;
   }
   set
   {
    tittleName=value;
   }
  }
 }
}

欢迎指教,谢谢大家!


相关文章
对该文的评论
CSDN 网友 ( 2005-11-11)
只有傻比才会这么做,但精神可佳
SaSBYa ( 2004-03-01)
关于Winform的DataGrid,有没有人想自己做一个啊,不用这个DataGrid了.
blackwhole ( 2004-02-27)
谢谢!非常感谢!!
我直接拿来了,还改了改。呵呵。

就是用的时候有2个问题。
1 我加了选择的那列,为什么单击时没反应呢?好象那列被禁用了一样。

2 其实是关于ADO.NET的。
我在update的时候老有错。是不是我的dataadapter的问题?可是我都给了相应的command了啊。
具体在这里
http://expert.csdn.net/Expert/topic/2782/2782250.xml?temp=.9781
能麻烦你去看看么?
SaSBYa ( 2004-02-11)

我做这个的时候主要考虑的是单表维护,它应该无法控制主细表结构,如果要控制多表显示维护的话,要做下来还是有些难度的,不过,谢谢 jonnyyu  ,提的意见值得一试。
jonnyyu ( 2004-02-11)
请问这样做比自己加一个DataSet有什么好处?
还有,这样做如何实现master/detail表的显示?