请问在Combo的下拉列表中可以显示一个DataTable列表吗? 可以,但是需要自己来绘制ComboBox的下拉列表。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以通过继承该控件来做.如点击ComboBox则显示一个DataGrid 是可以的。我以前写过一个,代码发给你: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)."); } } 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 }} 有没有人来说说Pet Shop 4.0的个人心得 [[ 散分 ]]怎么我的可用分不见增长,虽然我每天登陆 输入问题? help!如何在调用*.WAV文件 NND,我的WIN2003打不上补丁,SQL2005装不上啊,郁闷,谁有办法能打SP1? Flash播放加密问题 为何我重新安装了VS2003就出问题了。 TreeView控件的AutoSize C#textBox自动换行 加入的datagrid在浏览是显示不出来?? C# SOCKET 如何实现一个文件从一台电脑指定位置传输到另外一台电能指定位置????? USB的问题,如何知道向U盘中拷贝的什么文件,如何区分USB插入的是U盘还是鼠标
如点击ComboBox则显示一个DataGrid
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).");
}
}
{
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 }
}