【问题标题】:Cannot convert datagridview datasource to datatable [duplicate]无法将datagridview数据源转换为数据表[重复]
【发布时间】: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)));

标签: c# winforms datagridview


【解决方案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();
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 2021-08-01
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多