使用FlexGrid > 选择 > 选择和选择模式 > 通过代码选择单元格和对象 |
Selection属性是可读写的,所以你可以使用代码选择单元格范围。您还可以使用Select方法进行选择,就像在WinForms版本的C1FlexGrid控件那样。Select方法允许您选择单元格或范围,并可选地滚动新的选择范围到可视视图,以便用户可以看到它。
例如,为了选中Grid的第一个单元格并确保它位于用户可见范围,应使用以下代码:
C# |
拷贝代码
|
---|---|
// 选择第零行,第零列,并确保该单元格可见 fg.Select(0, 0, true); |
选择相关的方法均基于行和列的索引进行工作。但是您也可以用来基于单元格内容进行选择。例如,以下代码选择在Grid的“Name”列中,第一个包含指定字符串的行。
C# |
拷贝代码
|
---|---|
bool SelectName(string name) { // 在“Name”列查找包含指定字符串的行 int col = _flexGroup.Columns["Name"].Index; int row = FindRow(_flex, name, _flex.Selection.Row, col, true); if (row > -1) { _flex.Select(row, col); return true; } // 未查询到…… return false; } |
该代码使用的FindRow辅助方法定义如下:
C# |
拷贝代码
|
---|---|
// 在一个指定的列中查找包含某个文本的行 int FindRow(C1FlexGrid flex, string text, int startRow, int col, bool wrap) { int count = flex.Rows.Count; for (int off = 0; off <= count; off++) { // 搜索到底部且不允许循环查找?立即退出 if (!wrap && startRow + off >= count) { break; } // 从行中获取文本 int row = (startRow + off) % count; var content = flex[row, col]; // 如果查找到匹配项则返回匹配行的索引 if (content != null && content.ToString().IndexOf(text, StringComparison.OrdinalIgnoreCase) > -1) { return row; } } // 未查询到…… return -1; } |
该FindRow方法实现了在C1FlexGrid的WinForms版本中提供的FindRow方法的功能。此方法没有内置在Silverlight或WPF版本的Grid产品中,以使得控件所占用的尺寸尽可能的小。该方法在给定的列中搜索指定的字符串,从指定的行开始搜索,并可选地在搜索到末尾仍未查找到时返回到行首开始搜索。这在许多场景下已经具有足够的使用灵活性。
另一个常见的选择场景是在数据源中选择一个特定对象的情况。你的第一反应可能会查找并使用PagedCollectionView.IndexOf 方法从数据源集合中查找对象的索引,然后使用索引选择行。这种方法的问题是,它只有在数据没有进行分组时能够正常工作。如果已经将数据进行了分组,则分组行也将进行计数,这将导致数据源中的项目的索引和Grid中的行索引不匹配。
解决这种问题的最简单的方式是枚举每一行,并将您搜索的项目和每一行的DataItem属性进行比较。下面的代码演示了如何做到这一点:
C# |
拷贝代码
|
---|---|
var customer = GetSomeCustomer; #if false // ** 千万不要使用这种方式,因为它将在存在分组的情况下无法正常工作 int index = view.IndexOf(customer); if (index > -1) { _flex.Select(index, 0); } #else // 这是在Grid中搜索对象的安全方式 for (int row = 0; row <= _flex.Rows.Count; row++) { if (row.DataItem == customer) { _flex.Select(row, 0); break; } } #endif |