グリッドは、ユーザーアクションまたはコードによって選択範囲が変更されるたびに、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 メソッドを使用して、選択範囲のコンテンツを出力します。このメソッドは、このドキュメントで前述したグリッドのインデクサを使用して、選択された項目をループ処理することによって選択範囲の各セルのコンテンツを取得します。
GetClipString メソッドでループする場合は、Row、Row2、Column、Column2 の各プロパティの代わりに、CellRange の TopRow、BottomRow、LeftColumn、RightColumn の各プロパティを使用します。このようにする必要があるのは、ユーザーが選択する際の動作(マウスを上に向かってドラッグするか下に向かってドラッグするか)に応じて、Row が Row2 より大きくなる場合と小さくなる場合があるためです。
RowCollection.GetDataItems メソッドを使用すると、Selection から簡単に多くの有益な情報を抽出できます。このメソッドは、CellRange に関連付けられているデータ項目のコレクションを返します。このコレクションを取得したら、LINQ を使用して、選択された項目に関する情報を抽出および要約できます。
たとえば、Customer オブジェクトのコレクションに連結されたグリッドに対して、次の 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 を使用して、顧客の総数、"アクティブ" な顧客数、および選択範囲の顧客の総重量を取得します。LINQ は、このような処理に最適なツールです。柔軟性が高く表現力豊かで、コンパクトかつ効率的です。