0

gridview のデータを取得して に変換する際に問題が発生していますDataTable。実際には、私のアプリケーションのデータグリッドの一部には、ItemsSourceとしてキャストできるものがありますが、アプリケーションでDataView別のデータグリッドがItemsSource定義されているようです。

例えば:

DataGrid1 - ItemsSource = DataView (データベースから直接) DataGrid2 - ItemsSource = 製品の ObservableCollection DataGrid3 - ItemsSource = カテゴリの ObservaleCollection

私が得ているエラー:

System.Collections.ObjectModel.ObservableCollection`1[myApp.Product] タイプ のオブジェクトを タイプにキャストできません System.Data.DataView

私はこのようなものに到達したい:

  DataTable dt = null;
  try
  {
       dt = ((DataView)dg.ItemsSource).ToTable();
  }
  catch
  {
       Type t = dg.ItemsSource.GetType();
       dt = ((t)dg.ItemsSource).ToTable();
  }

ItemsSourceしたがって、実際にはコレクションをオブジェクトとして取得し、としてキャストしたいと思いますDataTable

それは可能ですか?

4

1 に答える 1

0

はい、可能です...あなたのエラーは言った

タイプ 'System.Collections.ObjectModel.ObservableCollection`1[myApp.Product]' のオブジェクトをタイプ 'System.Data.DataView' にキャストできません

これは、これらのクラス間に直接のキャスト関係がないことを意味します。それを提供するには、クラスを拡張してキャスト演算子ObservableCollection<T>をオーバーライドする必要があります。explicit

public class MyObservableCollection : ObservableCollection<YourDataType>
{
    public static explicit operator DataView(MyObservableCollection collection)
    {
        DataTable table = new DataTable();
        foreach (YourDataType item in collection)
        {
            // fill your DataTable however you want to here
        }
        return new DataView(table);
    }
 }

詳細については、MSDNの明示的な (C# リファレンス)ページを参照してください。MSDNのDataView.Table プロパティDataTableページから入力方法を見つけることができます。

更新 >>>

これはメソッドではありません。キャスト演算子です。あるタイプを別のタイプにキャストするために使用されます。次の例のよう(int)に:

int intValue = (int)doubleValue;

を にキャストする方法を尋ねObservableCollectionましたDataView。私の答えは、まさにそれを行う方法を示しています:

DataView dataView = (DataView)yourCustomObservableCollection;

またはあなたの例から:

dt = ((DataView)dg.ItemsSource).ToTable();

MyObservableCollection... このカスタムセットのインスタンスがdg.ItemsSource.

あなたが言った

DataGrid2 - ItemsSource = 製品の ObservableCollection DataGrid3 - ItemsSource = カテゴリの ObservaleCollection

  1. まず、お見せしたように新しいクラスを作成してください...好きな名前を付けてください。

  2. 次に、現在のObservableCollectionインスタンスを新しいMyObservableCollectionインスタンスに置き換えます。

それでおしまい。これ以上どう説明していいのかわからない。もしあなたが本当にこれを理解していないなら、あなたはこれらの質問をする場所がありません. MSDN にアクセスしてキャストのすべてを学習してから、これを理解するために戻ってくることをお勧めします。

于 2013-09-12T10:42:49.820 に答える