65.9K
CodeProject 正在变化。 阅读更多。
Home

可处理通用连接的自定义用户控件组合框(smartCombo)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.29/5 (8投票s)

2008 年 5 月 3 日

CPOL

2分钟阅读

viewsIcon

41488

downloadIcon

798

自定义用户控件组合框(smartCombo)。


可处理通用连接的自定义用户控件组合框(smartCombo)

SmartCombo001.jpg

引言

欢迎来到我在 Code Project 的第一篇文章!

这是一个非常简单的 C# Windows 应用程序,它解释了如何创建一个带有数据绑定的组合框的自定义控件。

我正在开发一个 Windows 应用程序,需要显示一个组合框,该组合框将使用 ValueMember 和 DisplayMember 加载数据。 我需要这样做,而无需实际插入 Query,然后指定属性值。 这些值将根据用户的自定义而定。 现在,连接将是一个主要点。 在这里,我使用了一个通用 IDBConnection,它可以接受 SQLConnection、OledbConnection、OdbcConnection 等。 通过一些修改,它可用于任何类型的数据源。 本文适用于那些想要在组合框中显示数据或想要制作自己的控件的人。 它将对此提供一个清晰的理解。

背景

我创建了一个非常简单的 Windows 表单,其中包含两个组合框。 一个将在单击“LoadData”按钮时加载。 另一个将在加载表单时加载。 在这里,我使用了一个继承自 Combo 类的 SmartCombo 类。 在那里,我使用了可以在设计时和运行时使用的方法和属性。 在这里,我使用了一个组合框(右侧组合框),该组合框在设计时支持加载数据。 并且左侧的组合框,我纯粹使用了运行时加载。 运行时,当用户按下 LoadData 按钮时,将执行以下代码。

       
smartCombo1.SetConnection = cn; 
smartCombo1.ValueID = "AccountNo";
smartCombo1.ValueText = "AccountName";
smartCombo1.TableName = "tblAccountInfo";
smartCombo1.WhereCondition = "AccountNo = 
'0000000112'";
//here we can use like 
//smartCombo1.WhereCondition = 
//"AccountName Like '%HO%'";
smartCombo1.SetDataSource(ProviderType.SqlServer);

另一种方法是我们可以进行设计时 SmartCombo 属性设置

SmartCombo003.gif

在设置属性之后,您必须添加以下代码以获取特定数据

            
//connection is generic. 
//You can use any 
//Connection(SQLConnection,Oledb,Odbc)

cn.Open();
smartCombo2.SetConnection = cn;
smartCombo2.SetDataSource(ProviderType.SqlServer);

这里 TableName = 我要从中加载数据的表名

ValueID = 将被视为隐藏值(如 ID)的字段名

ValueText = 将被视为 DisplayMember 的字段名

代码

编码的主要部分如下所示。 我在这里使用了一个枚举,用于选择合适的提供程序,如 Sql、Oledb、Odbc、Oracle 等。这里尚未实现 Oracle。 以及一些用于演示自定义表和字段的属性。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Data;

namespace CustomComboDataBinding
{
 class SmartCombo:ComboBox
 {
   #region Private Variable collection
   private IDbConnection _iConnection;
   private string _TableName;
   private string _valueID;
   private string _valueText;
   private string _whereCond="";
   #endregion

   #region Property Collection
   /// 
   /// Set generic Connection
   /// SQLConnection,OLEDBConnection,
   ///ODBCCOnnection accepted
   /// 
   public IDbConnection SetConnection
   {
    get { return _iConnection; }
    set { _iConnection = value; }
   }
   /// 
   /// Set or get the table name
   /// 
   public string TableName
   {
    set { _TableName = value; }
    get { return _TableName; }
   }

   /// 
   /// get or set
   /// The Item that will be not displayed 
   /// but treated as ID
   /// 
   public string ValueID
   {
    set { _valueID = value; }
    get { return _valueID; }
   }

   /// 
   /// get or set a item that will be 
   /// displayed on smart combo
   /// 
   public string ValueText
   {
    get { return _valueText; }
    set { _valueText = value; }
   }

   /// 
   /// get the item that is hidden 
   ///or treated as a ID or
   /// set from ValueID
   /// 
   public string Value
   {
    get { return base.SelectedValue.ToString(); }
   }

   /// 
   /// Get the display Item of the smart combo
   /// 
   public string Text
   {
    get { return base.Text; }
   }

   public string WhereCondition
   {
    get { return _whereCond; }
    set { _whereCond = value; }
   }

   #endregion
   /// 
   /// SetDatasource execute the final
   /// lines of code. It will load the
   /// data as per given attribute.
   /// 
   public void SetDataSource(ProviderType pType)
   {
    IDbDataAdapter iadpt;
    IDbCommand iCmd;
    string strSQL;
    DataSet ds;        
    try
    {
     if (WhereCondition == "")
     {
      strSQL = "Select [" + ValueID + "], 
      [" + ValueText + 
      "] FROM [" + TableName + "] ";
     }
     else
     {
      strSQL = "Select [" + ValueID + "], 
     [" + ValueText +    "] FROM [" + 
      TableName + "] WHERE " + WhereCondition;
     }
     iCmd = GetCommand(pType);
     iCmd.Connection = SetConnection;
     iCmd.CommandText = strSQL;
     iadpt = GetAdapter(pType);
     iadpt.SelectCommand = iCmd;
     ds = new DataSet();
     iadpt.Fill(ds);
     DataTable dt = MakeTable();
     dt = ds.Tables[0];
     base.DisplayMember = ValueText;
     base.ValueMember = ValueID;
     base.DataSource = dt.DefaultView;
    }
    catch (Exception ex)
    {
     throw ex;
    }
   }


   #region Private Function

   private DataTable MakeTable()
   {
    DataTable dt;
    dt = new DataTable("Source");
    dt.Columns.Add(ValueID);
    dt.Columns.Add(ValueText);
    return dt;
   }

   private IDbDataAdapter GetAdapter(ProviderType pType)
   {
    if (pType == ProviderType.SqlServer)
    {
     return new System.Data.SqlClient.SqlDataAdapter();
    }
    else if(pType == ProviderType.Oledb)
    {
     return new System.Data.OleDb.OleDbDataAdapter();
    }
    else if(pType == ProviderType.Odbc)
    {
     return new System.Data.Odbc.OdbcDataAdapter();
    }
    return null;
   }

   private IDbCommand GetCommand(ProviderType pType)
   {
    if (pType == ProviderType.SqlServer)
    {
     return new System.Data.SqlClient.SqlCommand();
    }
    else if (pType == ProviderType.Oledb)
    {
     return new System.Data.OleDb.OleDbCommand();
    }
    else if (pType == ProviderType.Odbc)
    {
     return new System.Data.Odbc.OdbcCommand();
    }
    return null;
   }
   #endregion
  }

  /// 
  /// ProviderType enum.
  /// 
  public enum ProviderType
  {
   SqlServer,
   Oledb,
   Odbc
  }
}
  • 代码做什么?

答: 此代码演示了如何制作以某种自定义方式工作的用户控件。 在这里,我实现了一个组合框,并根据开发人员的使用情况将其设置为自定义数据绑定。 我称之为 smartCombo 控件。

  • 我如何将其集成到我现有的代码中?或者我该如何使用它?

答: 编译项目后,只需从工具箱中拖放 smartCombo 控件,并根据需要使用即可。

结论

这是我在 code project 上的第一篇文章。 所以请给我适当的建议

详细说明


Author009.jpg

Md Arifuzzaman(微软认证技术专家)

协助数据库报表开发人员

Metatude Asia Ltd

达卡,孟加拉国

电子邮件:arif_uap@yahoo.com

© . All rights reserved.