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






4.64/5 (4投票s)
这里我放置了 FastGrid 控件的源文件、二进制文件和简要说明。
引言
这是一个自定义的 Windows Forms 网格控件,其外观和行为类似于标准的 System.Windows.Forms.DataGridView
控件。该控件使用 .NET 4.0 编写。对于标准网格,我过去只利用其一部分功能。我很少使用它的编辑功能。但我经常需要实现排序、列大小调整和一些格式化选项。所以我编写了一个简单的网格控件,并将其命名为 FastGrid
。它确实比标准网格快一些:示例程序包括两个示例 (FastGrid
vs DataGridView
)。在这些示例中,FastGrid
使失效的速度大约快 40%。
FastGrid
控件的主要特性是
- 它很快
- 它“开箱即用”地支持行的排序
- 单元格的格式化对我来说更简单
- 而且,自动调整列大小的功能也更可预测
最重要的是,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 像素。注意:我可以同时为多个列提供此排序属性。下一列用于名为 IsMale
的 bool? 属性。这里我为此字段提供了自定义格式化逻辑(格式化程序)。ColumnWidth
设置为 60 像素,并且在调整网格大小的同时不会更改。
下一列(“Occupation”)中的文本显示为超链接 - 当鼠标光标悬停在上面时,它会突出显示。此外,当满足特定条件(Person.Occupation
为 None
)时,文本将以深蓝色打印。超链接列本身不提供处理用户点击它的任何逻辑。相反,我使用网格的事件处理程序 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 日。