将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;
}
}
}
}
欢迎指教,谢谢大家!