本文将要实现的功能是来自实际的客户需求,在 C1TrueDBGrid for WinForms 表格控件中显示数据行号,类似于 Excel 第一列中显示的行号效果。 C1TrueDBGrid for WinForms 本身没有内置这样的功能,因为,在 C1TrueDBGrid 中第一列是用于显示单元格选中标志,下面我们就来看看如何在 C1TrueDBGrid 中实现这一功能。
在 C1TrueDBGrid 中无法自定义行头,所以我们会添加一个新的非绑定列用来代替原始的行头,并将新添加用于显示行号的列放在在表格的最左边,在添加的非绑定列中会显示行号和选中标志。当非绑定列添加之后,会触发 UnboundColumnFetch 事件,我们可以在该事件中完成以上需求,代码如下:
private void c1TrueDBGrid1_UnboundColumnFetch(object sender, C1.Win.C1TrueDBGrid.UnboundColumnFetchEventArgs e){if (e.Row == row)
{e.Value = "";}else
{if (!filter)
{e.Value = (e.Row + 1).ToString();}else
{if (!filterdone)
{counter++;for (int i = filindex; i < filtercol.Length; i++){if (filtercol[i] == c1TrueDBGrid1.Columns[c1TrueDBGrid1.Col].FilterText || filtercol[i].StartsWith(c1TrueDBGrid1.Columns[c1TrueDBGrid1.Col].FilterText))
{e.Value = rowindex[i];filindex = i + 1;filteredindexes[counter - 1] = rowindex[i];break;
}}if (counter == c1TrueDBGrid1.RowCount)
{counter = 0;filterdone = true;
}}else
{e.Value = filteredindexes[e.Row];}}}}
接下来我们需要在 OwnerDrawCell 事件中根据当前行是否是选中行来判断单元格是显示行号还是显示选中标志,代码如下:
// 处理OwnerDrawCell 事件
this.c1TrueDBGrid1.OwnerDrawCell += (ss, ee) =>
{if (ee.Row == row)
ee.Style.BackgroundImage = Image.FromFile(@"..\..\Images\Rec_Sel.png");
};
运行截图:
源码下载:VS2010 + C1 Studio for WinForms 2013V1