无法将datagridview数据源转换为数据表[重复]

Posted

技术标签:

【中文标题】无法将datagridview数据源转换为数据表[重复]【英文标题】:Cannot convert datagridview datasource to datatable [duplicate] 【发布时间】:2017-08-03 07:16:50 【问题描述】:

我已将数据从 json 绑定到 datagridview,如下所示:

dynamic result = JsonConvert.DeserializeObject<List<productData>>(temp);
mproductDataGridView.DataSource = result;

稍后我想做一些过滤:

mproductDataGridViewstring rowFilter = string.Format("[0] = '1'", "type_id", "configurable");
DataTable dt = (DataTable)mproductDataGridView.DataSource;
dt.DefaultView.RowFilter = rowFilter;

有一个错误(我翻译):

cannot convert system.Collections.Generic.List to System.Data.DataTable object

有人知道是什么问题吗?如何解决这个问题?

【问题讨论】:

问题是List 不是DataTable。也许你会想在设置 DataSource 之前将列表转换为 DataTable 数据表做过滤 当我有 JSON 字符串时,我通常将其转换为 DataTable,如下所示 DataTable dtSerialized = (DataTable)JsonConvert.DeserializeObject(jsonString, (typeof(DataTable))); 【参考方案1】:

添加这个函数并调用它,它将List转换为DataTable。

public static DataTable ToDataTable<T>(List<T> items)

        DataTable dataTable = new DataTable(typeof(T).Name);

        //Get all the properties
        PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in Props)
        
            //Defining type of data column gives proper data table 
            var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);
            //Setting column names as Property names
            dataTable.Columns.Add(prop.Name, type);
        
        foreach (T item in items)
        
           var values = new object[Props.Length];
           for (int i = 0; i < Props.Length; i++)
           
                //inserting property values to datatable rows
                values[i] = Props[i].GetValue(item, null);
           
           dataTable.Rows.Add(values);
      
      //put a breakpoint here and check datatable
      return dataTable;

【讨论】:

【参考方案2】:

您发布的代码存在问题,仅将过滤后的数据放入新的DataTable。在发布的第二组代码中,它似乎正在从mproductDataGridView.DataSource 创建名为dt 的新DataTable。然后对这个新表应用一个过滤器。假设过滤器适用,但DataTable 作为一个整体仍然包含所有未过滤的数据。 @Alex Bagnolini How to pass DataTable.Select() result to a new DataTable? 提供的一种简单方法

这种方法从过滤器字符串中创建一个新的DataTable。您显然需要根据您的要求调整过滤器字符串。

string formatString = "FirstName LIKE'" + txtFirstName.Text.Trim().Replace("'", "''") + "%' AND " +
                      "LastName LIKE'" + txtLastName.Text.Trim().Replace("'", "''") + "%'";
DataTable dt2 = result.Select(formatString).CopyToDataTable();

希望对你有帮助

【讨论】:

以上是关于无法将datagridview数据源转换为数据表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将值从 datagridview 转换为文本框

将 Datagridview 的 DataSource 转换为 List?

Datagridview如何将选定的行转换为自定义对象

在 DataGridView 中显示之前将时间戳(Datetime.ticks)从数据库转换为 Datetime 值

将列表框转换为 DataGridView

如何在已经绑定数据源的datagridview添加一行数据并保存到数据库??