Winform Datagridview无法显示数据。

4

我的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;
    }

你能否也添加这个调用的代码:ConvertToDataTable - Isma
@Isma,请查看编辑。 - Aleksa Ristic
你尝试过在分配数据表之前设置 dataGridView1.DataSource = null 吗? - GuidoG
我相信问题出在NeaktivniPartner类上...它缺少一个getter和setter。如果没有它们,DataGridView.DataSource将不知道该显示什么。 - JohnG
@JohnG 是的,我忘了那个。大约一年前它困扰着我,但我现在忘了它。只需添加 {get; set;} 就可以了。如果你不回答,我会在两天内回答。谢谢 :) - Aleksa Ristic
显示剩余4条评论
3个回答

2

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; }
}

1
你应该将BindingSource作为DataGridView的数据源。此外,Control的Refresh方法用于呈现控件,对其数据源没有影响。
以下是一个简单的示例:
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; }
    }
}

0

很抱歉听到您的问题。我刚刚发现为什么DataGridView无法显示数据绑定列表。原来是网格视图不会自动生成列。 为了生成网格列,您需要更改NeaktivniPartner类以使用成员属性,而不是成员变量,如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接