65.9K
CodeProject 正在变化。 阅读更多。
Home

一个快速且简单的 DataGridView 替代方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (4投票s)

2013 年 1 月 18 日

CPOL

2分钟阅读

viewsIcon

40850

downloadIcon

192

这里我放置了 FastGrid 控件的源文件、二进制文件和简要说明。

引言

这是一个自定义的 Windows Forms 网格控件,其外观和行为类似于标准的 System.Windows.Forms.DataGridView 控件。该控件使用 .NET 4.0 编写。对于标准网格,我过去只利用其一部分功能。我很少使用它的编辑功能。但我经常需要实现排序、列大小调整和一些格式化选项。所以我编写了一个简单的网格控件,并将其命名为 FastGrid。它确实比标准网格快一些:示例程序包括两个示例 (FastGrid vs DataGridView)。在这些示例中,FastGrid 使失效的速度大约快 40%。

FastGrid 控件的主要特性是

  • 它很快 Smile | <img src=  
  • 它“开箱即用”地支持行的排序
  • 单元格的格式化对我来说更简单
  • 而且,自动调整列大小的功能也更可预测

最重要的是,FastGrid 以源代码的形式提供,因此可以很容易地进行自定义。

 

背景

很久以前,有一个小而简单的网格控件…… 随着时间的推移,该控件变得越来越大、越来越智能。所以,它就在这里。

使用代码

只需将 FastGrid 放置在您的 Form 上,然后通过如下代码填充其行

List<MyObjectClass> objects = GetObjects(…);
fastGrid.DataBind(objects, typeof(MyObjectClass), false, null, 65, string.Empty); 

通过这种方式,网格会自动从 MyObjectClass 类型规范生成列,为每个公共实例属性创建一个列(未标记为 Browsable[false] 属性)。列标题要么从 DisplayName 属性派生,要么从属性名称本身派生。然后,您只需调用 fastGrid.DataBind(objects),同时列集已经创建好。您可以从 TestApp 项目的 MainForm.cs 中看到它是如何工作的。

当然,通过这种方式,您无法控制大多数关于格式化和用户交互的事情。相反,您可以编程方式填充列

grid.columns.Add(new FastColumn("FirstName", "Name")
      {
         ColumnMinWidth = 70,
         SortOrder = FastColumnSort.Ascending
      });

grid.columns.Add(new FastColumn("IsMale", "Gender")
      {
         ColumnWidth = 60,
         /* format cell value: "-" if gender is not specified, "male" for true, "female" for false */
         formatter = c => c == null ? "-" : (bool)c ? "Male" : "Female"
      });

grid.columns.Add(new FastColumn("Occupation", "Occupation")
         {
             ColumnWidth = 70,
             IsHyperlinkStyleColumn = true,
             HyperlinkActiveCursor = Cursors.Hand,
             HyperlinkFontActive = new Font(Font, FontStyle.Bold),
             ColorHyperlinkTextActive = Color.Blue,
             /* highlight unemployed */
             colorColumnFormatter = (object c, out Color? back, out Color? fnt) =>
                    {
                        back = null;
                        fnt = ((Person.PersonOccupation)c) == Person.PersonOccupation.None ? Color.DarkBlue : Color.Black;
                    }
             }); 

首先,我为名为“FirstName”的字段添加了一个列,并给它起了标题“Name”。我指定该列应按升序排序,并将其最小宽度限制为 70 像素。注意:我可以同时为多个列提供此排序属性。下一列用于名为 IsMalebool? 属性。这里我为此字段提供了自定义格式化逻辑(格式化程序)。ColumnWidth 设置为 60 像素,并且在调整网格大小的同时不会更改。

下一列(“Occupation”)中的文本显示为超链接 - 当鼠标光标悬停在上面时,它会突出显示。此外,当满足特定条件(Person.OccupationNone)时,文本将以深蓝色打印。超链接列本身不提供处理用户点击它的任何逻辑。相反,我使用网格的事件处理程序 UserHitCell,如下所示

if (col.PropertyName != "Occupation") return;
var pers = (Person) grid.rows[rowIndex].ValueObject; 

还有一个注意事项:通过以下代码行,可以很容易地获得所有选定的行或选定的对象

var selectedPeople = grid.rows.Where(r => r.Selected).Select(r => (Person) r.ValueObject).ToList(); 

希望您能从所有这些代码中得到一些有价值的东西。作为一个小小的奖励,这里有一个下拉控件 FastGridCombo - 一个下拉框,展开时使用 FastGrid 而不是简单的列表框。

历史 

发布于 2013 年 1 月 18 日。

© . All rights reserved.