【问题标题】:Winform Datagridview doesn't display dataWinform Datagridview 不显示数据
【发布时间】:2018-05-15 13:01:03
【问题描述】:

绑定数据不适用于我的 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 里面有行:

除此之外我尝试过:

  • 删除 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 看看编辑
  • 在分配数据表之前您是否尝试过设置dataGridView1.DataSource = null
  • 试过了,还是不行。我在按钮开始时添加了调试,单击以查看listdatagridview.rows 内的row.count()。首先单击两者返回 0(这是预期的),但第二次单击列表返回 20k 并且 dgv 返回 0。
  • 我确信问题出在NeaktivniPartner 类上……它缺少getter 和setter。没有它们,DataGridView.DataSource 将不知道要显示什么。

标签: c# winforms datagridview


【解决方案1】:

JohnG 提到了 cmets 中的问题,但我会在这里发布完整的答案。

所以解决方案是改为:

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】:

    您应该使用 BindingSource 作为 DataGridView 的数据源。此外,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; }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-31
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多