使用FlexGrid > 选择 > 选择和选择模式 > 监控选择 |
一旦选择发生变化,可以是由于用户操作或者代码修改所引起,Grid将触发SelectionChanged事件,允许您处理新的选择结果。
例如,下面的代码可以监视选择并在选择更改时发送信息到控制台:
C# |
拷贝代码
|
---|---|
void _flex_SelectionChanged(object sender, CellRangeEventArgs e) { CellRange sel = _flex.Selection; Console.WriteLine("selection: {0},{1} - {2},{3}", sel.Row, sel.Column, sel.Row2, sel.Column2); Console.WriteLine("selection content: {0}", GetClipString(_flex, sel)); } static string GetClipString(C1FlexGrid fg, CellRange sel) { var sb = new System.Text.StringBuilder(); for (int r = sel.TopRow; r <= sel.BottomRow; r++) { for (int c = sel.LeftColumn; c <= sel.RightColumn; c++) { sb.AppendFormat("{0}\t", fg[r, c].ToString()); } sb.AppendLine(); } return sb.ToString(); } |
一旦选择发生变化,代码将列举表示当前选择的CellRange的坐标。
同时它还使用GetClipString方法输出选择范围的内容,该方法遍历选择的项目并使用Grid的索引获取选择范围中每一个单元格的内容。关于索引,在本文档之前有所介绍。
请注意,GetClipString方法中的for循环使用单元格的TopRow,ButtomRow,LeftColumn以及RightColumn苏醒,而不是Row,Row2,Column以及Column2属性。
这是必须的,因为Row可能大于或者小于Row2,取决于用户如何执行该选择(在选择时向上或者向下拖拽鼠标)。
您可以很容易地通过Rows.GetDataItems方法从Selection中抽取大量有用的信息。该方法返回一个关联到一个CellRange的数据项的集合。一旦你有了这个集合,你可以使用LINQ进行提炼和总结有关选定项目的信息。
例如,可以考虑为一个绑定到Customer对象集合的Grid使用以下SelectionChanged事件处理的替代方案:
C# |
拷贝代码
|
---|---|
void _flex_SelectionChanged(object sender, CellRangeEventArgs e) { // 获取选定范围内的客户对象 var customers = _flex.Rows.GetDataItems(_flex.Selection).OfType<Customer>(); // 使用LINQ从选中的客户对象集合中抽取信息 _lblSelState.Text = string.Format( "{0} items selected, {1} active, total weight: {2:n2}", customers.Count(), (from c in customers where c.Active select c).Count(), (from c in customers select c.Weight).Sum()); } |
注意,该代码使用OfType运算符将选中的数据项转换为Customer类型。一旦该步骤完成,代码将使用LINQ获取一个总数,一个“active”状态的客户数,以及选中客户的总权重。LINQ是完成这类工作的完美工具。它是灵活,富有表现力的,紧凑而且高效。