2012-05-01 23:59:39|?次阅读|上传:wustguangh【已有?条评论】发表评论
完成了上述准备工作以后,我们就可以对设计的网格控件进行测试了,下面是一个使用IList实例的显示方法:
private void Form1_Load(object sender, EventArgs e) {
// invoke the outlook style
menuSkinOutlook_Click(sender, e);
// setup our example list of business objects
// in this case a list of contacts
ContactList = new ArrayList();
ContactList.Add(new ContactInfo(1,
"Mark",
DateTime.Now.Subtract(TimeSpan.FromDays(2)),
"as the world turns",
0.54));
ContactList.Add(new ContactInfo(2,
"Mark",
DateTime.Now.Subtract(TimeSpan.FromDays(8)),
"GTST",
0.54));
ContactList.Add(new ContactInfo(3,
"Piet",
DateTime.Now.Subtract(TimeSpan.FromDays(1)),
"Day after",
0.35));
ContactList.Add(new ContactInfo(4,
"Herre",
DateTime.Now.Subtract(TimeSpan.FromDays(17)),
"Wodka lime",
0.9567));
ContactList.Add(new ContactInfo(5,
"Ronald",
DateTime.Now.Subtract(TimeSpan.FromDays(42)),
"I need some coffee",
0.54));
ContactList.Add(new ContactInfo(6,
"Piet",
DateTime.Now.Subtract(TimeSpan.FromDays(167)),
"Mr Bean",
0.653));
// invoke inital filling, in this case unbound data
menuUnboundContactList_Click(sender, e);
}
下面这个函数完成了鼠标单击事件的响应,实现数据的分组和排序功能:
// this event is called when the user clicks on a cell
// in this particular case we check to see if one of the column headers
// was clicked. If so, the grid will be sorted based on the clicked column.
// Note: this handler is not implemented optimally. It is merely used for
// demonstration purposes
private void outlookGrid1_CellClick(object sender, DataGridViewCellEventArgs e) {
if (e.RowIndex < 0 && e.ColumnIndex >= 0) {
ListSortDirection direction = ListSortDirection.Ascending;
if (e.ColumnIndex == prevColIndex) // reverse sort order
direction = prevSortDirection == ListSortDirection.Descending ?
ListSortDirection.Ascending : ListSortDirection.Descending;
// remember the column that was clicked and in which direction is ordered
prevColIndex = e.ColumnIndex;
prevSortDirection = direction;
// set the column to be grouped
outlookGrid1.GroupTemplate.Column = outlookGrid1.Columns[e.ColumnIndex];
//sort the grid (based on the selected view)
switch (View) {
case "BoundContactInfo":
outlookGrid1.Sort(new ContactInfoComparer(e.ColumnIndex, direction));
break;
case "BoundCategory":
outlookGrid1.Sort(new DataRowComparer(e.ColumnIndex, direction));
break;
case "BoundInvoices":
outlookGrid1.Sort(new DataRowComparer(e.ColumnIndex, direction));
break;
case "BoundQuarterly":
// this is an example of overriding the default behaviour of the
// Group object. Instead of using the DefaultGroup behavious, we
// use the AlphabeticGroup, so items are grouped together based on
// their first character:
// all items starting with A or a will be put in the same group.
IOutlookGridGroup prevGroup = outlookGrid1.GroupTemplate;
// execption when user pressed the customer name column
if (e.ColumnIndex == 0)
{
// simply override the GroupTemplate to use before sorting
outlookGrid1.GroupTemplate = new OutlookGridAlphabeticGroup();
outlookGrid1.GroupTemplate.Collapsed = prevGroup.Collapsed;
}
// set the column to be grouped
// this must always be done before sorting
outlookGrid1.GroupTemplate.Column = outlookGrid1.Columns[e.ColumnIndex];
// execute the sort, arrange and group function
outlookGrid1.Sort(new DataRowComparer(e.ColumnIndex, direction));
//after sorting, reset the GroupTemplate back to its default (if it was changed)
// this is needed just for this demo. We do not want the other
// columns to be grouped alphabetically.
outlookGrid1.GroupTemplate = prevGroup;
break;
default: //UnboundContactInfo
outlookGrid1.Sort(outlookGrid1.Columns[e.ColumnIndex], direction);
break;
}
}
}
这个函数非常重要,通过不同的数据类型想排序函数Sort传入不同的比较器进行排序,其业务逻辑比较简单,在此不进行详细讨论,到此,一个完整的自定义网格组件项目便完成了,有任何补充和建议欢迎在评论区域进行讨论。