Winform Datagridview不显示数据

时间:2018-05-15 13:01:03

标签: c# winforms datagridview

绑定数据不适用于我的datagridview。

这是.cs文件

using FirebirdSql.Data.FirebirdClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Magacin
{
    public partial class AnalizaPartneraGlobal : Form
    {
        List<Int_String> partneri = Komercijalno.Partner.Lista();
        List<NeaktivniPartner> neaktivniPartneri = new List<NeaktivniPartner>();
        public AnalizaPartneraGlobal()
        {
            InitializeComponent();
            dataGridView1.AutoGenerateColumns = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            foreach(Int_String partner in partneri)
            {
                double danaBezProdaje = (DateTime.Today - Komercijalno.Partner.PoslednjaKupovina(partner._int)).TotalDays;
                if ( danaBezProdaje > 31)
                {
                    NeaktivniPartner np = new NeaktivniPartner();
                    np.ppid = partner._int;
                    np.naziv = partner._string;
                    np.danaBezKupovine = danaBezProdaje;
                    neaktivniPartneri.Add(np);
                }
            }
            dataGridView1.DataSource = M.List.ConvertToDataTable(neaktivniPartneri);
            dataGridView1.Refresh();
        }
    }

    public class NeaktivniPartner
    {
        public int ppid;
        public string naziv;
        public double danaBezKupovine;
    }
}

如您所见,我只有buttondataGridView

如果我早些时候回想起我一直在做dataGridView.dataSource = myGenericList;工作完美但由于某种原因现在它没有用,所以我尝试将其转换为DataTable但仍然无效。然后我添加了AutogenerateColumns,仍然没有显示任何数据或列。然后尝试添加Refresh(),但仍然没有。

在调试器中,它显示datagridview里面有行: enter image description here

除此之外我试过:

  • 删除datagridview并再次执行所有操作
  • 关闭VS并再次打开
  • 尝试使用BindingList
  • 进行此操作
  • 直接尝试绑定列表到数据源

ConvertToDataTable背后的代码

public static DataTable ConvertToDataTable<T>(IList<T> data)
{
        PropertyDescriptorCollection properties =
           TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        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)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }

3 个答案:

答案 0 :(得分:0)

您应该使用BindingSource作为DataGridView的DataSource。此外,Control的Refresh方法用于呈现控件,对其DataSource没有影响。

这是一个简单的例子:

public partial class Form1 : Form
{
    private List<TestModel> _dataList = new List<TestModel>();
    private BindingSource _binding = new BindingSource();

    public Form1()
    {
        InitializeComponent();

        dataGridView1.AutoGenerateColumns = true;
        _binding.DataSource = _dataList;
        dataGridView1.DataSource = _binding;
    }

    private int _counter = 0;
    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            _counter++;
            _dataList.Add(new TestModel()
            {
                ID = _counter,
                Name = "Name " + _counter
            });
        }
        _binding.ResetBindings(false);
    }

    private class TestModel
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

答案 1 :(得分:0)

JohnG在评论中提到了问题,但我会在这里发表完整答案。

所以解决方案是代替这个:

public class NeaktivniPartner
{
    public int ppid;
    public string naziv;
    public double danaBezKupovine;
}

我设置了这个:

public class NeaktivniPartner
{
    public int ppid { get; set; }
    public string naziv { get; set; }
    public double danaBezKupovine { get; set; }
}

答案 2 :(得分:0)

对不起,您的问题。我只是发现了为什么DataGridView将不显示数据绑定列表。事实证明,网格视图不会自动生成列。 为了生成网格列,您必须将NeaktivniPartner类更改为使用成员属性,而不是成员变量,如下所示:

public class NeaktivniPartner
{
    public int ppid {get; set;}
    public string naziv {get; set;}
    public double danaBezKupovine {get; set;}
}