绑定数据不适用于我的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;
}
}
如您所见,我只有button
和dataGridView
如果我早些时候回想起我一直在做dataGridView.dataSource = myGenericList;
工作完美但由于某种原因现在它没有用,所以我尝试将其转换为DataTable
但仍然无效。然后我添加了AutogenerateColumns
,仍然没有显示任何数据或列。然后尝试添加Refresh()
,但仍然没有。
除此之外我试过:
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;
}
答案 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;}
}