c# - 从列表中填写 c# 中的表的问题

标签 c#

我正在使用 WindowsFormC#我正在填写 List<>到目前为止一切都很好

在我的 list<>我有 103 条记录,但是当我传递给我的 DataTable没有记录只出现在标题中,也就是说,当我收到我的表格时,所有内容都显示为 null

事实是,我对此有点陌生,这是我正在研究的第一个。

List<MSProject.Task> tasks = new List<MSProject.Task>();
DataTable Tabla = new DataTable();
Tabla = ListToDataTable(tasks);

我的代码
public static DataTable ListToDataTable<T>(IList<T> data)
    {
        DataTable table = new DataTable();

        //special handling for value types and string
        if (typeof(T).IsValueType || typeof(T).Equals(typeof(string)))
        {

            DataColumn dc = new DataColumn("Value");
            table.Columns.Add(dc);
            foreach (T item in data)
            {
                DataRow dr = table.NewRow();
                dr[0] = item;
                table.Rows.Add(dr);
            }
        }
        else
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            foreach (PropertyDescriptor prop in properties)
            {
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            }
            foreach (T item in data)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                {
                    try
                    {
                        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    }
                    catch (Exception ex)
                    {
                        row[prop.Name] = DBNull.Value;
                    }
                }
                table.Rows.Add(row);
            }
        }
        return table;
    }

提前致谢

最佳答案

我已经运行了您的代码并且可以正常工作,我认为问题是 MSProject.Task 没有任何公共(public)属性,并且您仅在属性中进行迭代。 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
见下面的代码:

//with properties    
public class MSProject.Task 
{
    public string Name {get; set;}
    public string code {get; set;}
}

//no properties
public class MSProject.Task2 
{
    public string Name;
    public string code;
}


private void ShowRownsInGrid()
{
    //it works shows rows in DataGridView!
    List<MSProject.Task> tasks = new List<MSProject.Task>()
        {
            new MSProject.Task(){ Name = "Joao", code = "01215452124"},
            new MSProject.Task(){ Name = "Maria", code = "4564678"},

        };
        DataTable Tabla = new DataTable();
        Tabla = ListToDataTable(tasks);

        MessageBox.Show(Tabla.Rows.Count.ToString()); //Show '2'
        dataGridView1.DataSource = Tabla; //Show 2 rows
 }



private void DontShowRownsInGrid()
{
     //it doesn't work, no rows are displayed in the DataGridView!
     List<MSProject.Task2> tasks = new List<MSProject.Task2>()
        {
            new MSProject.Task2(){ Name = "Joao", code = "01215452124"},
            new MSProject.Task2(){ Name = "Maria", code = "4564678"},

        };
        DataTable Tabla = new DataTable();
        Tabla = ListToDataTable(tasks);

        MessageBox.Show(Tabla.Rows.Count.ToString()); //Show '2'
        dataGridView1.DataSource = Tabla; //does not show lines
 }

关于c# - 从列表中填写 c# 中的表的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60099844/

相关文章:

c# - 如何将视频的第一帧保存为图像?

c# - 如何在 Linux 上的 asp.net 核心中捕获退出信号?

c# - ReSharper - var hint only for none basic type

c# - 统一: Player Jumping Issue

c# - 在Asp.net MVC Controller 上执行异步OnAction

c# - 如何从 Action 中返回值

c# - LINQ to Sharepoint InsertOnSubmit 问题

c# - 使用基类作为 IEnumerable<T> 的泛型

c# - 如何将 GUID 属性设置为 null

c# - BufferedStream Flush() 不写入 MemoryStream()?