3

以下のコードを試してみましたが、datagridview に何も表示されません。

助言がありますか?

string strFilterOption = "dtcolnPurchaseProductExpProductNo=270";
dgvProductExp.DataSource = dtPurchaseProductExp.Select(strFilterOption);
4

3 に答える 3

2

MSDNから

DataGridView クラスは、標準の Windows フォーム データ バインディング モデルをサポートします。つまり、データ ソースは、次のインターフェイスのいずれかを実装する任意の型にすることができます。

1 次元配列を含む IList インターフェイス。

DataTable や DataSet クラスなどの IListSource インターフェイス。

BindingList クラスなどの IBindingList インターフェイス。

BindingSource クラスなどの IBindingListView インターフェイス。

配列を使用したデータ バインディングの既定の動作により、DataSource プロパティに対して、Datatable.Select メソッドが返す Datarows の配列を設定することはできません。この投稿から:

主なものは、オブジェクトが IList を実装しているか、1 次元配列であることです。問題は、配列にはデータバインディングのデフォルトの動作であるリフレクションがあるということです。配列内のオブジェクト タイプが反映されて、インデックスが付けられておらず、グリッドで表現できる値タイプを持つパブリック プロパティが検出されます。これらのプロパティは、データバインディングが発生したときにフィールドとして使用されます。配列のデータ型は DataRow なので、HasErrors、Item、ItemArray、RowError、RowState、Table の 6 つのパブリック プロパティがあります。ただし、Item はインデックス付きプロパティであり、ItemArray は Object() 型であり、グリッドビューに表示できないため、これら 2 つのプロパティは無視され、他の 4 つはグリッドに表示されます。

したがって、別の方法として、DataTable ソースからスキーマを取得するために Clone メソッドを使用して新しい DataTable を作成し、新しい DataTable に DataRows の配列を設定します。

string strFilterOption = "dtcolnPurchaseProductExpProductNo=270";
DataTable cloneTable;
cloneTable = dtPurchaseProductExp.Clone();
foreach (DataRow row in dtPurchaseProductExp.Select(strFilterOption))
{
   cloneTable.ImportRow(row);
}
dgvProductExp.DataSource = cloneTable;

または、BindingSource オブジェクトを介してバインディングを行い、その Filter プロパティを使用することもできます。

于 2013-07-04T18:53:01.620 に答える