无法将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 的 DataSource 转换为 List?