//  DataSource setup: 
//   
//  Create a Table named Test and add 2 columns 
//   ID:     int 
//   Name:   string 
// 
DataTable dtTest = new DataTable(); 
dtTest.Columns.Add("ID", typeof(int)); 
dtTest.Columns.Add("Name", typeof(string)); 

dtTest.Rows.Add(1, "John"); 
dtTest.Rows.Add(2, "Amy"); 
dtTest.Rows.Add(3, "Tony"); 
dtTest.Rows.Add(4, "Bruce"); 
dtTest.Rows.Add(5, "Allen"); 

// Bind the ComboBox to the DataTable 
this.comboBox1.DataSource = dtTest; 
this.comboBox1.DisplayMember = "Name"; 
this.comboBox1.ValueMember = "ID"; 

// Enable the owner draw on the ComboBox. 
this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
// Handle the DrawItem event to draw the items. 
this.comboBox1.DrawItem += delegate(object cmb, DrawItemEventArgs args) 
{ 
    // Draw the default background 
    args.DrawBackground(); 


    // The ComboBox is bound to a DataTable, 
    // so the items are DataRowView objects. 
    DataRowView drv = (DataRowView)this.comboBox1.Items[args.Index]; 

    // Retrieve the value of each column. 
    string id = drv["id"].ToString(); 
    string name = drv["name"].ToString(); 

    // Get the bounds for the first column 
    Rectangle r1 = args.Bounds; 
    r1.Width /= 2; 

    // Draw the text on the first column 
    using (SolidBrush sb = new SolidBrush(args.ForeColor)) 
    { 
        args.Graphics.DrawString(id, args.Font, sb, r1); 
    } 

    // Draw a line to isolate the columns  
    using (Pen p = new Pen(Color.Black)) 
    { 
        args.Graphics.DrawLine(p, r1.Right, 0, r1.Right, r1.Bottom); 
    } 

    // Get the bounds for the second column 
    Rectangle r2 = args.Bounds; 
    r2.X = args.Bounds.Width/2; 
    r2.Width /= 2; 

    // Draw the text on the second column 
    using (SolidBrush sb = new SolidBrush(args.ForeColor)) 
    { 
        args.Graphics.DrawString(name, args.Font, sb, r2); 
    } 
};