0

我在获取 gridview 数据并将其转换为DataTable. 实际上,它就像我的应用程序中的一些数据网格,ItemsSource我可以将其转换为DataView,但另一个ItemsSource在应用程序中定义。

例如:

DataGrid1 - ItemsSource = DataView(直接来自数据库) DataGrid2 - ItemsSource = ObservableCollection of Product DataGrid3 - ItemsSource = ObservaleCollection of Categories

我得到的错误:

无法将类型的对象 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();
  }

所以实际上我想将集合作为对象并转换ItemsSourceDataTable.

甚至可能吗?

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# 参考)页面了解更多信息。DataTable您可以从MSDN的DataView.Table 属性页面了解如何填写。

更新>>>

不是一种方法。它是一个强制转换运算符。它用于将一种类型转换为另一种类型。就像(int)下面的例子:

int intValue = (int)doubleValue;

您问如何将 anObservableCollection转换为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 回答