当前位置:编程学习 > C#/ASP.NET >>

请问在Combo的下拉列表中可以显示一个DataTable列表吗?

请问在Combo的下拉列表中可以显示一个DataTable列表吗? --------------------编程问答-------------------- 可以,但是需要自己来绘制ComboBox的下拉列表。 --------------------编程问答-------------------- 可以,但是只可以绑定一列. --------------------编程问答-------------------- 可以通过继承该控件来做.
如点击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

}
}
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,