zoukankan      html  css  js  c++  java
  • 贴个东东试试.以前偶自己贴到CSDN上过.

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

    欢迎指教,谢谢大家!  5555555  还有很多要改进的东西

  • 相关阅读:
    6.12
    20121006晴
    6.11
    测试利器IL级别的Debug工具“Deblector1.1.1修改版”
    Windows Phone开发经验谈(15)动态的改变APP的字体大小
    windows8开发直播windows8商店开发者帐号注册过程(完)
    Windows Phone开发经验谈(13)华为网盘直链API调用
    windows8开发App审核折腾记
    Asp.net开发经验利用Aspose.Words按模板导出Word
    Windows Phone开发经验谈(17)两则改善用户体验的开发技巧
  • 原文地址:https://www.cnblogs.com/sasbya/p/4483.html
Copyright © 2011-2022 走看看