MultiColumn ComboBox with Configurable Display and Value Members and Fast Search functionality


After searching for a MultiColumn ComboBox with configurable view columns, configurable display & value members, I decided to create my own control.

The Multi-Column ComboBox is a combination of TextBox, Button & DataGridView control. Since I had a need to create a control like a ComboBox and with search functionality, I decided to use DataGridView & it's filter criteria for fast search functionality.

One of the harder things to figure out was what container to show on key press of the combo control. I used ToolStripDropDown as a host control for DataGridView to show the ComboBox popup on key press.


Common Properties:

  1. Show Header: Set column header visibility.
  2. Grid Lines: Set grid lines as None, Vertical, Horizontal or Both.
  3. DropDown Height: Configurable dropdown height. It will show scrollbar if more items present.
  4. DataSource: DataSource will be a DataTable.
  5. SourceDataString: Mapping Properties which will be shown as Columns.
  6. SourceDataHeader: Column Headers which will be shown if Show Header property is true.
  7. ColumnWidth: Width for each column.
  8. Display Column No: Column number which will be work as a DisplayMember.
  9. Value Column No: Column number which will be work as a ValueMember.


The Control usage is very simple & straight forward. Set the following properties to configure the control:

private void InitializeComboBox()
    multiColumComboBox1.SourceDataString = new string[3] { "ID", "Name", "Code" };          
    multiColumComboBox1.ColumnWidth = new string[3] { "0", "200", "50" };        
    multiColumComboBox1.DataSource = GetDataSource();          

private DataTable GetDataSource()
    DataTable dtSource = new DataTable();
    DataColumn dtColID = new DataColumn("ID");
    dtColID.DataType = System.Type.GetType("System.String");

    DataColumn dtColName = new DataColumn("Name");
    dtColName.DataType = System.Type.GetType("System.String");

    DataColumn dtColCode = new DataColumn("Code");
    dtColCode.DataType = System.Type.GetType("System.String");

    //Add rows
    DataRow row = dtSource.NewRow();          
    row[dtColID] = "1";
    row[dtColName] = "Vijay";
    row[dtColCode] = "1001";

    //Add rows
    row = dtSource.NewRow();
    row[dtColID] = "2";
    row[dtColName] = "Ajay";
    row[dtColCode] = "1002";

    . . . . .
    . . . . .

    return dtSource;