FlexGrid for WPF
選択範囲の取得
基本操作 > 選択 > 選択範囲と選択モード > 選択範囲の取得

 In the the following section learn how to implement Monitor Selection in FlexGrid .NET 4.5.2 and .NET 5 versions.

               

FlexGrid は、ユーザーの操作またはコードによって選択範囲が変更されるたびに、SelectionChanged イベントを発生させます。これにより、新しい選択範囲に対応することができます。

たとえば、次のコードは、選択取得を監視し、選択範囲が変更されると、コンソールに情報を出力します。

C#
コードのコピー
 private void grid_SelectionChanged(object sender, CellRangeEventArgs e)
        {
            CellRange sel = grid.Selection;
            Console.WriteLine("選択範囲: {0}, {1} - {2}, {3}",
                sel.Row, sel.Column, sel.Row2, sel.Column2);
            Console.WriteLine("択範囲のコンテンツ: {0}",
            GetClipString(grid, sel));
        }

        static string GetClipString(C1FlexGrid grid, 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", grid[r, c].ToString());
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }
               

このコードは、選択範囲が変更されるたびに、現在の選択範囲を表す CellRange の座標をリストします。また、GetClipString メソッドを使用して、選択範囲のコンテンツを出力します。このメソッドは、このドキュメントで前述したグリッドのインデクサを使用して、選択された項目をループ処理することによって選択範囲の各セルのコンテンツを取得します。GetClipString メソッドの for ループは、RowRow2Column、および Column2 プロパティではなく、CellRangeTopRowBottomRowLeftColumn、および RightColumn プロパティを使用することに注意してください。このようにする必要があるのは、ユーザーが選択する際の動作(マウスを上に向かってドラッグするか下に向かってドラッグするか)に応じて、RowRow2 より大きくなる場合と小さくなる場合があるためです。GetDataItems メソッドを使用すると、Selection から簡単に多くの有益な情報を抽出できます。このメソッドは、CellRange に関連付けられているデータ項目のコレクションを返します。このコレクションを取得したら、LINQ を使用して、選択された項目に関する情報を抽出および要約できます。

たとえば、Customer オブジェクトのコレクションに連結されたグリッドに対して、次の SelectionChanged メソッドの代替実装を考えます。

C#
コードのコピー
void grid_SelectionChanged(object sender, CellRangeEventArgs e)
{
  // 選択された範囲内の顧客を取得します。
  var customers =
    grid.Rows.GetDataItems(grid.Selection).OfType<Customer>();

  // LINQ を使用して、選択された顧客の情報を抽出します。
  _lblSelState.Text = string.Format(
    "{0} 選択された項目, {1} アクティブ, 総体重: {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 は、このような処理に最適なツールです。柔軟性が高く表現力豊かで、コンパクトかつ効率的です。

               

ユーザーの操作またはコードによって選択範囲が変更されるたびに、SelectionChangedイベントを発生させます。これにより、新しい選択範囲に対応することができます。

たとえば、次のコードは、選択取得を監視し、選択範囲が変更されると、コンソールに情報を出力します。

C#
コードのコピー
private void grid_SelectionChanged(object sender, C1.WPF.Grid.GridCellRangeEventArgs e)
{
    //DOC Code Snippet1
    GridCellRange sel = grid.Selection;
    Console.WriteLine("selection: {0}, {1} - {2}, {3}", sel.Row, sel.Column, sel.Row2, sel.Column2);
    Console.WriteLine("selection content: {0}",
    GetClipString(grid, sel));
}

static string GetClipString(FlexGrid grid, GridCellRange sel)
{
    var sb = new System.Text.StringBuilder();
    for (int r = sel.Row; r <= sel.Row2; r++)
    {
        for (int c = sel.Column; c <= sel.Column2; c++)
        {
            sb.AppendFormat("{0}\t", grid[r, c].ToString());
        }
        sb.AppendLine();
    }
    return sb.ToString();
} 
               

このコードは、選択範囲が変更されるたびに、現在の選択範囲を表す GridCellRangeの座標をリストします。また、GetClipString メソッドを使用して、選択範囲のコンテンツを出力します。このメソッドは、このドキュメントで前述したグリッドのインデクサを使用して、選択された項目をループ処理することによって選択範囲の各セルのコンテンツを取得します。GetClipString メソッドの for ループは、RowRow2Column、および Column2 プロパティではなく、GridCellRange の TopRowBottomRowLeftColumn、および RightColumn プロパティを使用することに注意してください。このようにする必要があるのは、ユーザーが選択する際の動作(マウスを上に向かってドラッグするか下に向かってドラッグするか)に応じて、RowRow2 より大きくなる場合と小さくなる場合があるためです。

関連トピック