2

DataGridViewフォームにコントロールを表示し、コントロールのプロパティをDataTable介してオブジェクトを設定しています。DataSource行が選択されたときに行全体を選択するようにコントロールを設定し、複数選択を有効にしました。これらはすべてスムーズに機能します。

ユーザーは複数の行を選択してボタンをクリックできます。DataTable選択した行のコピーを使用して新しいオブジェクトを作成し、それを Crystal Report に渡したいと考えています。

これを行う効率的な手段はありますか?唯一の方法は、選択したグリッド セルから新しい行を解析することですDataTable。これは、比較的ばかげていると思います。

4

2 に答える 2

1

これは、「選択した行を DataTable として取得する方法」という質問に対する私の解決策です。

  1. 元の DataTable のコピー構造
  2. 各行をコピーします (行は 1 つのデータテーブル オブジェクトにのみ存在する可能性があるため)

    DataTable selectedRows = (sourceDataGridView.DataSource as DataTable).Clone();
    
    foreach(DataGridViewRow row in sourceDataGridView.SelectedRows) {
        selectedRows.Rows.Add((row.DataBoundItem as DataRowView).Row.ItemArray);
    }
    
于 2013-11-11T10:11:38.153 に答える
0

DataTable必要な行を見つけるために を反復処理するのを避ける最善の方法は、DataView代わりに a にバインドすることです。このようにして、 でやりたいことを並べ替えたり、その他すべての楽しいことをしたりDataGridView、基になる を手動で解析しなくても必要なデータを取得したりできますDataTable

以下は、検索せずに DataRow を取得するために必要なすべてを示す簡潔な例です。

DataGridView dataGridView1 = new DataGridView();
DataTable tb = new DataTable();
DataView dv = tb.AsDataView();
dataGridView1.DataSource = dv;
// Get the row indexes in whatever your favorite manner is.
List<int> selectedRowIndexes = YourGetSelectedRowIndexesMethod();
foreach(int selectedRowIndex in selectedRowIndexes)
    DataRow dr = dv[selectedRowIndex].Row;

選択したインデックスを取得する簡単な方法の 1 つ (必要な場合に備えて):

List<int> indexes = new List<int>();
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
    indexes.Add(row.Index);
}
于 2013-06-06T02:39:04.083 に答える