我将数据绑定到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
任何人都知道这是什么问题?如何解决这个问题?
答案 0 :(得分:0)
添加此函数并调用它,它会将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;
}
答案 1 :(得分:0)
您发布的代码只会将过滤后的数据转换为新的DataTable
。在发布的第二组代码中,似乎是从DataTable
创建名为dt
的新mproductDataGridView.DataSource
。然后将过滤器应用于此新表。当前过滤器适用,但DataTable
整体仍包含所有未过滤数据。来自@Alex Bagnolini的一个简单方法How to pass DataTable.Select() result to a new DataTable?
此方法从过滤字符串中创建新的DataTable
FROM。您显然需要根据您的要求调整过滤器字符串。
string formatString = "FirstName LIKE'" + txtFirstName.Text.Trim().Replace("'", "''") + "%' AND " +
"LastName LIKE'" + txtLastName.Text.Trim().Replace("'", "''") + "%'";
DataTable dt2 = result.Select(formatString).CopyToDataTable();
希望这有帮助