首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

WinForm DataGridView控件怎么做到Excel这种筛选? [图]

2012-01-28 
WinForm DataGridView控件如何做到Excel这种筛选? [图]VS2005,WinForm,C#,SQL2000请问:VS2005自带的DataGr

WinForm DataGridView控件如何做到Excel这种筛选? [图]
VS2005,WinForm,C#,SQL2000



请问:
VS2005自带的DataGridView控件能否做到 类似Excel的这种筛选功能?

或者提供下其它的方法,思路也可以;

[谢绝UP者,谢绝帮顶者,谢绝路过者]

[解决办法]
为每一列group后的值动态生成下拉列表框
[解决办法]
我提供个思路,也就是DataGridView空间中加了list 的功能
自己编写一个类,继承DataGridView,左键点击格网空白处时,弹出下拉列表进行功能设计
[解决办法]
发段代码上来 希望对你有帮助!!

[code=C#][/code]/// <summary>
/// 触发CellPainting事件
/// </summary>
/// <param name="e"></param>
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
#region 画列头下拉框

if (isColumnHeaderFilter && e.RowIndex == -1 && e.ColumnIndex > -1)
{
string columnName = Columns[e.ColumnIndex].Name;
bool find = false;
foreach (string name in filterColumnNames)
{
if (string.Compare(name, columnName, true) == 0)
{
find = true;
break;
}
}
if (find)
{
e.PaintBackground(e.ClipBounds, false);
e.PaintContent(e.ClipBounds);
e.Paint(e.ClipBounds, DataGridViewPaintParts.SelectionBackground | DataGridViewPaintParts.Focus |
DataGridViewPaintParts.ErrorIcon | DataGridViewPaintParts.ContentBackground);
// 画按钮
Rectangle rect = GetColumnHeaderDropDownBounds(e.CellBounds);
e.Graphics.FillRectangle(SystemBrushes.ButtonFace, rect);
Point pLT = rect.Location;
Point pRT = new Point(rect.Right, rect.Top);
Point pLB = new Point(rect.Left, rect.Bottom);
Point pRB = new Point(rect.Right, rect.Bottom);
e.Graphics.DrawLine(SystemPens.ButtonHighlight, pLT, pRT);
e.Graphics.DrawLine(SystemPens.ButtonHighlight, pLT, pLB);
e.Graphics.DrawLine(SystemPens.ButtonShadow, pRT, pRB);
e.Graphics.DrawLine(SystemPens.ButtonShadow, pLB, pRB);
// 画三角形
Point p31 = new Point(pLT.X + (pRT.X - pLT.X) / 4, pLT.Y + (pLB.Y - pLT.Y) / 4);
Point p32 = new Point(pRT.X - (pRT.X - pLT.X) / 4, pLT.Y + (pLB.Y - pLT.Y) / 4);
Point p33 = new Point(pLT.X + (pRT.X - pLT.X) / 2, pLB.Y - (pLB.Y - pLT.Y) / 4);
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
int[] columnList = new int[columnHeaderFilter.Keys.Count];
columnHeaderFilter.Keys.CopyTo(columnList, 0);
if (Array.IndexOf(columnList, e.ColumnIndex) == -1)
{
e.Graphics.FillPolygon(SystemBrushes.ControlText, new Point[] { p31, p32, p33, p31 });
}
else
{
e.Graphics.FillPolygon(SystemBrushes.ControlLightLight, new Point[] { p31, p32, p33, p31 });
}
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
e.Handled = true;
}
}

#endregion

base.OnCellPainting(e);
}
[code=C#][/code]
------解决方案--------------------


DataGridView空间中加了list 的功能 
自己编写一个类,继承DataGridView,左键点击格网空白处时,弹出下拉列表进行功能设计
[解决办法]

探讨
http://msdn.microsoft.com/zh-cn/library/aa480727(en-us).aspx
谁能把这个翻译, 贴个示例出来?

[解决办法]
这里高手真多啊
[解决办法]
很好很强大
[解决办法]
DataGridView空间中加了list 的功能 
自己编写一个类,继承DataGridView,左键点击格网空白处时,弹出下拉列表进行功能设计
[解决办法]
lz你真是太有才列...
以前也考虑过这个问题,但是都没有什么思路解决的
看到你贴出来,哈哈
好好学习,到时候lz搞出来了记得也给我来个小实例啊...
lq349076387@yahoo.com.cn
谢谢啊....
[解决办法]
你提供的网页里面有demo下载,你看看他的源程序就可以了。
[解决办法]
不大懂,有没有详细点的
[解决办法]
探讨
发段代码上来 希望对你有帮助!!

/// <summary>
/// 触发CellPainting事件
/// </summary>
/// <param name="e"> </param>
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
#region 画列头下拉框

if (isColumnHeaderFilter && e.RowIndex == -1 && e.ColumnIndex > -1)
{


[解决办法]
应该不用想楼上说的那些那么麻烦 我记得datagridviewRow 有一种就是下拉菜单的Row 可以先在初始化的时候插入第一行 剩下的就不用我说了吧
[解决办法]
有点悬
如果是在绑定数据之后在做处理估计会报错的!
[解决办法]
下载地址:http://download.microsoft.com/download/4/2/1/4215444a-ed19-45fe-84a9-2eb0b7b9dcbb/DataGridViewAutoFilter.zip 

这个看来相当不错,收藏以后有时间再研究研究,呵呵。
[解决办法]
话说 Delphi的第三方控件EhDBGrid里有一模一样的功能,而且有源代码可以参考,如果不介意是pascal的话。。。
[解决办法]
Mark
[解决办法]
为什么要把如此简单的东西麻烦化.虽然直接放在控件里很合适.但不觉得有其他更好的方法来实现相同的功能么?比如,右键等...
[解决办法]
使用vs2008 做的话,好点点。
[解决办法]
我帮不了你,多查查资料吧
[解决办法]
很不错的时候能给你

热点排行