将OleDbDataAdapter绑定到Winform下的DataGrid

来源:互联网 发布:折八百淘宝商城 编辑:程序博客网 时间:2024/05/17 22:27

       将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;
   }
  }
 }
}

欢迎指教,谢谢大家!

原创粉丝点击