可以,但是需要自己来绘制ComboBox的下拉列表。

解决方案 »

  1.   

    可以通过继承该控件来做.
    如点击ComboBox则显示一个DataGrid
      

  2.   

    是可以的。我以前写过一个,代码发给你:
    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Windows.Forms;namespace LooongSoft
    {
    /// <summary>
    /// 支持多列数据显示的ComboBox
    /// </summary>
    public class MultiColumnComboBox:ComboBox
    {
    #region variables
    private System.ComponentModel.Container components = null;
    //确定哪些列显示出来
    private int[] _displayColumns = null;
    //计算显示列的显示宽度
    private int[] _displayWidths = null;
    //数据表
    private DataTable _dtSource = null;
    //显示的数据行
    private DataRow[] _drDisplay = null;
    //列与列之间的间隙
    private int _columnSpacing = 4;
    //是否是第一次初始化items
    private bool _needInitItem = true;
    //列分隔符
    private bool _needSeperator = false;
    #endregion
     
    #region initialize
    public MultiColumnComboBox()
    {
    if(components == null)
    components = null;
    this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable ;
    }
     
    #region Component Designer generated code
       /**//// <summary>
       /// Required method for Designer support - do not modify 
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
       }
     
    #endregion
    #endregion
     
    #region Inherited events
    protected override void OnDrawItem(DrawItemEventArgs e)
    {
    try
    {
    int iIndex = e.Index;
    if(_drDisplay == null)
    return;
    if(iIndex >= _drDisplay.Length)
    return;
    if(iIndex > -1)
    {
    int iXPos = 0;
    int iYPos = 0;
     
    if(_drDisplay.Length == 0)
    return;    
    e.DrawBackground();
    //处理分隔符
    int iLeftSpacing1 = _columnSpacing/2;
    int iLeftSpacing2 = _columnSpacing - iLeftSpacing1 ;
    for(int index = 0; index < _dtSource.Columns.Count; index++)
    {
    if(!this.ColumnIsDisplay(index,_displayColumns))
    continue;
    int idwIndex = GetColumnIndexOfArray(_displayColumns,index);
    int idw = idwIndex==-1?80:_displayWidths[idwIndex];
    e.Graphics.DrawString(_drDisplay[iIndex][index].ToString(), Font, new SolidBrush(e.ForeColor), new RectangleF(iXPos, e.Bounds.Y, idw, ItemHeight));
    //iXPos += idw + iLeftSpacing1 ;
    if(NeedSeperator)
    {
    if(index != 0 && index != _dtSource.Columns.Count -1)
    {
    //e.Graphics.DrawString(Seperator, Font, new SolidBrush(e.ForeColor), new RectangleF(iXPos + idw + iLeftSpacing1, e.Bounds.Y, iLeftSpacing1, ItemHeight));
    e.Graphics.DrawLine(new Pen(e.ForeColor) ,new PointF(iXPos + idw - iLeftSpacing1,iIndex*ItemHeight) , new PointF(iXPos + idw - iLeftSpacing1,(iIndex+1)*ItemHeight)) ;
    }
    }
    iXPos += idw ;
    }
    iXPos = 0;
    iYPos += ItemHeight;
    e.DrawFocusRectangle();
    base.OnDrawItem(e);
    }
    }
    catch(Exception ex)
    {
    throw new Exception(ex.Message + "\r\nIn ColumnComboBox.OnDrawItem(DrawItemEventArgs).");
    }
    }
      

  3.   

    protected override void OnDropDown(EventArgs e)
    {
    if(_needInitItem)
    {
    InitItems();
    _needInitItem = false;
    }
    InitDisplay();
    base.OnDropDown (e);
    }
     
    protected override void OnDataSourceChanged(EventArgs e)
    {
    base.OnDataSourceChanged (e);
    InitDisplay();
    }
    #endregion #region Property
    [Category("MultiColumn")]
    [Description("显示的列,分别用对应列的index来表示.")]
    public int[] DisplayColumns
    {
    get{return _displayColumns;}
    set{_displayColumns = value;}
    }
    [Category("MultiColumn")]
    [Description("显示的数据")]
    public DataTable Data
    {
    get{return _dtSource ;}
    set
    {
    DataSource = value;
    _dtSource = value;
    }
    }
    [Category("MultiColumn")]
    [Description("不同列之间是否需要分隔符")]
    public bool NeedSeperator
    {
    get{return _needSeperator ;}
    set{_needSeperator = value;}
    }
    #endregion #region private methods
    private bool ColumnIsDisplay(int column,int[] columns)
    {
    if(column< 0)
    throw new Exception("column must be greater than 0.\r\n(private method)ColumnIsDisplay(int,int[])") ;
    if(columns == null)
    {
    columns = new int[1] ;
    columns[0] = 0;
    }
    else if(_dtSource != null)
    {
    if(columns.Length > _dtSource.Columns.Count)
    throw new Exception("DisplayColumns' count cannot be greater than count of datasource.\r\n(private method)ColumnIsDisplay(int,int[])") ;
    }
    foreach(int c in columns)
    {
    if(c == column)
    return true;
    }
    return false;
    }
    private int GetColumnIndexOfArray(int[] columns,int column)
    {
    int iResult = -1;
    if(column< 0)
    throw new Exception("column must be greater than 0.\r\n(private method)ColumnIsDisplay(int,int[])") ;
    if(_dtSource != null)
    {
    if(columns.Length > _dtSource.Columns.Count)
    throw new Exception("DisplayColumns' count cannot be greater than count of datasource.\r\n(private method)ColumnIsDisplay(int,int[])") ;
    }
    for(int c = 0;c<columns.Length;c++)
    {
    if(columns[c] == column)
    return c;
    }
    return iResult;
    }
    private void InitDisplay()
    {
    _displayWidths = new int[_displayColumns.Length>0?_displayColumns.Length:1] ;
    SizeF size = new SizeF(10000,ItemHeight) ;
    Graphics graphics = CreateGraphics();
    foreach(DataRow dr in this._drDisplay)
    {
    for(int i = 0;i<this._dtSource.Columns.Count ;i++)
    {
    int iexist = this.GetColumnIndexOfArray(_displayColumns,i); 
    if(iexist != -1)
    {
    string stmp = dr[i].ToString() ;
    int itmpwidth = (int)graphics.MeasureString(stmp,Font,size).Width ;
    if(itmpwidth > _displayWidths[iexist])
    _displayWidths[iexist] = itmpwidth;
    }
    }
    }
    graphics.Dispose() ;
    int iwid = 0;
    for(int w = 0;w < _displayWidths.Length ;w++)
    {
    _displayWidths[w] += _columnSpacing;
    iwid += _displayWidths[w] ;
    }
    DropDownWidth = 1;
    if(iwid>Width)
    Width = iwid;
    } private void InitItems()
    {
    _drDisplay = _dtSource.Select()  ;
    } #endregion }
    }