【问题标题】:Get typeof DataGrid data and cast as it获取 typeof DataGrid 数据并转换为它
【发布时间】:2013-09-16 16:03:15
【问题描述】:

我在获取 gridview 的数据并将其转换为 DataTable 时遇到问题。实际上,我的应用程序中的一些数据网格有ItemsSource,我可以将其转换为DataView,但另一个在应用程序中定义了ItemsSource

例如:

DataGrid1 - ItemsSource = DataView(直接来自数据库) DataGrid2 - ItemsSource = 产品的 ObservableCollection 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();
  }

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

有可能吗?

【问题讨论】:

    标签: wpf gridview casting datatable itemssource


    【解决方案1】:

    是的,有可能......你的错误说

    无法将“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 上的 explicit (C# Reference) 页面了解更多信息。您可以从 MSDN 的 DataView.Table Property 页面了解如何填写 DataTable

    更新>>>

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

    int intValue = (int)doubleValue;
    

    您询问如何将ObservableCollection 转换为DataView。我的回答向您展示了如何做到这一点:

    DataView dataView = (DataView)yourCustomObservableCollection;
    

    或者来自你的例子:

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

    ...假设此自定义MyObservableCollection 的实例设置为dg.ItemsSource

    你说

    DataGrid2 - ItemsSource = ObservableCollection of Product DataGrid3 - ItemsSource = ObservaleCollection of Categories

    1. 所以首先,像我向你展示的那样创建一个新类...随便你怎么称呼它。

    2. 接下来,用新的 MyObservableCollection 实例替换当前的 ObservableCollection 实例。

    就是这样。我不知道该怎么解释。如果你真的不明白这一点,那么你就没有地方问这些问题了。我建议你去 MSDN 了解有关铸造的所有知识,然后再回来了解这一点。

    【讨论】:

    • 感谢您的快速回答,但实际上这是我第一次看到像显式运算符这样的东西。如果可能的话,您能否分享一些示例代码,我应该如何使用它?以 Product 类型为例。提前致谢!
    • 我将答案中的第一个链接(显式(C# 参考))更改为解释其使用并提供 C# 示例的页面。请查看该页面以获得更多帮助。
    • 嗯,例如你显示有华氏度 f = new Fahrenheit(100.0f);它使用参数运行公共静态显式运算符摄氏度(华氏度 f)。所以我可能愚蠢的问题是,我应该传递什么来将返回对象作为数据表?
    • 为什么要返回DataTable?您的代码 (dt = ((DataView)dg.ItemsSource).ToTable();) 需要 DataView。如果您真的想要这样做,只需将我给您的explicit 运算符定义中的DataView 更改为DataTable 并返回DataTable 而不是DataView
    • 对不起,我的错误。它应该是 DataView 而不是 DataTable。我的问题应该更像是如何将集合传递给显式并获取返回的数据?
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多