將OleDbDataAdapter繫結到Winform下的DataGrid (轉)

themoney發表於2007-10-05
將OleDbDataAdapter繫結到Winform下的DataGrid (轉)[@more@]

  將OleDataAdapter繫結到下的DataGrid,這個說法是不是有點奇怪:不妨看看,偶用了一個晚上寫出來的,寫的不好大家見諒。

  當然,有了這樣的一種繫結方法,那麼同樣我們還可以繼承出繫結DataAdapter的DataGrid .大家不妨試一試,偶寫的不好,就當拋磚引玉。

相關的屬性方法和事件:

  CustomDataGrid 例項化一個新的CustomDataGrid,用於OleDB
 
  CustomDataGrid 例項化一個新的CustomDataGrid控制元件,用於OleDB
 
  DataGridOleDbDataAdapter 給CustomDataGrid控制元件賦值新的OleDbDataAdapter
 
  FillDataSetAndBindAfterBindOleDBDataAdapter CustomDataGrid的BindOleDbDataAdapter傳入新值後是否顯示新的資料
 
  DataBind CustomDataGrid對OleDBDataAdapter的繫結
 
  Update 提交所有更改
 
  CancelUpdate 放棄所有更改
 
  DeleteRows 刪除所有選擇項(刪除不影響原始資料,必需後才發生)
 
  Enable 是否允許多選(同刪除有關,同介面有關)
 
  constructDataGridDisplayStyles 根據DataSet資料型別建立資料顯示方式
 
  AddSelectRow 增加新列,用於選擇
 
  TableTittle 屬性 對應表的標題 

 

 

 

 

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

namespace Forward.WinUI
{
 ///


 /// CustomDataGrid 的摘要說明。
 ///

 public class CustomDataGrid : System.Windows.Forms.DataGrid
 {
 ///
 /// 必需的設計器變數。
 ///

 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;
 ///


 /// 例項化一個新的CustomDataGrid控制元件,用於OleDB
 ///

 public CustomDataGrid()
 {
 // 該是 Windows.Forms 窗體設計器所必需的。
 InitializeComponent();

 // TODO: 在 InitializeComponent 呼叫後新增任何初始化
 }

 ///


 /// 例項化一個新的CustomDataGrid控制元件,用於OleDB
 ///

 /// 傳入的OleDbDataAdapter
 public CustomDataGrid(System.Data.OleDb.OleDbDataAdapter BindOleDbAdp)
 {
 // 該呼叫是 Windows.Forms 窗體設計器所必需的。
 InitializeComponent();

 // TODO: 在 InitializeComponent 呼叫後新增任何初始化
 BindOleDbAdp=this.DataGridOleDbDataAdapter ;
 }


 ///


 /// 清理所有正在使用的資源。
 ///

 protected overr void Dispose( bool disposing )
 {
 if( disposing )
 {
 if( components != null )
 components.Dispose();
 }
 base.Dispose( disposing );
 }

 #region Component Designer generated code
 ///


 /// 設計器支援所需的方法 - 不要使用程式碼編輯器
 /// 修改此方法的內容。
 ///

 private void InitializeComponent()
 {
 components = new System.ComponentModel.Container();
 this.ContentDataSet=new System.Data.DataSet();
 tittleName=null;
 }
 #endregion

 #region 給CustomDataGrid控制元件賦值新的OleDbDataAdapter
 ///


 /// 給CustomDataGrid控制元件賦值新的OleDbDataAdapter
 ///

 public System.Data.OleDb.OleDbDataAdapter DataGridOleDbDataAdapter
 {
 get
 {
 return this.BindOleDbDataAdapter ;
 }
 set
 {
 BindOleDbDataAdapter=value;
 
 //是否填充資料集並顯示
 if (FillAfterBindADP)
 {
 DataBind(); 
 }
 }

 }
 #endregion

 #region FillDataSetAndBindAfterBindOleDBDataAdapter  CustomDataGrid的BindOleDbDataAdapter傳入新值後是否顯示新的資料
 ///


 /// CustomDataGrid的BindOleDbDataAdapter傳入新值後是否顯示新的資料
 ///

 public bool FillDataSetAndBindAfterBindOleDBDataAdapter
 {
 get
 {
 return FillAfterBindADP;
 }
 set
 {
 FillAfterBindADP=value;
 }
 }
 #endregion

 #region DataBind CustomDataGrid對OleDBDataAdapter的繫結
 ///


 /// CustomDataGrid對OleDBDataAdapter的繫結
 ///

 public void DataBind()
 {
 if (this.BindOleDbDataAdapter!=null)
 {
 this.ContentDataSet.Tables.Clear();
 BindOleDbDataAdapter.Fill(this.ContentDataSet );
 this.Data=null;
 constructDataGridDisplayStyles();
 this.DataSource=this.ContentDataSet.Tables[0]; 
 }
 
 }
 #endregion

 #region Update 提交所有更改
 ///


 /// 提交所有更改
 ///

 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 放棄所有更改
 ///


 /// 放棄所有更改
 ///

 public void CancelUpdate()
 {
 DataBind();
 }
 #endregion

 #region Delete 刪除所有選擇項
 ///


 /// 刪除所有選擇項(刪除不影響原始資料,必需更新資料庫後才發生)
 ///

 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 是否允許多選(同刪除有關,同介面有關)
 ///


 /// 是否允許多選(同刪除有關,同介面有關)
 ///

 public bool EnableSelect
 {
 get
 {
 return EnableMultiSelect;
 }
 set
 {
 EnableMultiSelect=value;
 }
 }
 #endregion

 #region constructDataGridDisplayStyles 根據DataSet資料型別建立資料顯示方式
 ///


 /// 根據DataSet資料型別建立資料顯示方式
 ///

 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].Mappiame=dc.ColumnName ;
 break;
 default:
 tempDGCS[currCount]=new System.Windows.Forms.DataGridTextBoxColumn();
 tempDGCS[currCount].MapName=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 {
 tempDGTS.GridColumnStyles.Add(tempDGCS[i]);
 }
 for(int i=0;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

 ///


 /// 增加新列,用於選擇
 ///

 private void AddSelectRow()
 {
 DataColumn dc=new DataColumn("Select",System.Type.GetType("System.Boolean"));
 dc.DefaultValue=false;
 this.ContentDataSet.Tables[0].Columns.Add(dc);
 
 }

 ///


 /// 屬性 對應表的標題
 ///

 public string[] TableTittle
 {
 get
 {
 return tittleName;
 }
 set
 {
 tittleName=value;
 }
 }
 }
}

歡迎指教,謝謝大家!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章