将 DataGridView 绑定到 List<T> 不显示数据

Posted

技术标签:

【中文标题】将 DataGridView 绑定到 List<T> 不显示数据【英文标题】:Binded DataGridView to List<T> not showing data 【发布时间】:2012-12-11 02:02:42 【问题描述】:

这是我的代码(这是一个非常简单的例子):

public partial class Form1 : Form

    List<Person> listPersons;
    public Form1()
    
        InitializeComponent();
        listPersons = new List<Person>();
        dataGridView1.DataSource = listPersons;
    

    private void button1_Click(object sender, EventArgs e)
    
        if (textBox1.Text.Length > 0)
        
            Person p = new Person();
            p.Name = textBox1.Text;
            listPersons.Add(p);
        
    


class Person

    public string Name  get; set; 

当您按下按钮时,数据会添加到列表中,但不会显示在 DataGridView 中。我错过了什么?

我尝试将AutoGenerateColumnsVirtualMode 设置为true,但这也没有解决问题。

【问题讨论】:

【参考方案1】:

已经有一段时间了,自从处理尝试将 Lists 绑定到 DataGridViews 的 WinForms 代码以来,我已经换了工作。如果我没记错的话,无论你绑定什么都需要实现 IBindingList,而 List 没有。我可能错了。

无论如何,我使用的是BindingListView,它非常快速和简单。你只需这样做:

List<Customer> customers = GetCustomers();
BindingListView<Customer> view = new BindingListView<Customer>(customers);
dataGridView1.DataSource = view; 

你就完成了。几年没看源码了,但我相信它用一个实现 IBindingList 的类包装了 List

【讨论】:

+1 DataGridView 的文档说实现 IList 的 DataSource 可以工作,但首选 IBindingSource,因为它会自动处理很多绑定问题,大概是这样的。 @jam40jeff:是的,我必须查一下。如果您想以任何方式对列表进行排序,IBindingList 似乎是一项要求。 抱歉,在 VS 2008 及更早版本中没有 BindingListView 类。将尝试对 BindingList 类做同样的事情 - 让你知道 不,使用 BindingList 不起作用。它仍然没有更新 dataGridView(我再说一遍,我没有任何 BndingListView 类)。 @MitjaBonca:BindingListView 不是内置的。它是一个第三方库(查看链接)。【参考方案2】:

但如果我只使用BindingList&lt;T&gt; 而不是List&lt;T&gt; 它确实有效。

示例代码:

    BindingList<Person> bl;
    public Form1()
    
        InitializeComponent();
        bl = new BindingList<Person>();
        dataGridView1.DataSource = bl;
    

    private void button1_Click(object sender, EventArgs e)
    
        if (textBox1.Text.Length > 0)
        
            Person p = new Person();
            p.Name = textBox1.Text;
            bl.Add(p);
            textBox1.Text = "";
            textBox1.Focus();
        
        

但我仍然想弄清楚如何在 DataGridView 与 List 绑定后显示数据。

【讨论】:

【参考方案3】:

集中您的 FillGrid 功能并在您想要更新网格时调用它

public Form1()

    InitializeComponent();
     listPersons = new List<Person>();

    FillGrid();


private void button1_Click(object sender, EventArgs e)

    if (textBox1.Text.Length > 0)
    
        Person p = new Person();
        p.Name = textBox1.Text;
        listPersons.Add(p);

        FillGrid();
    


private void FillGrid()

   dataGridView1.DataSource = listPersons;

【讨论】:

所以每次我都会设置DataSource?不,这也不起作用。【参考方案4】:

使用数组绑定datagridview ie

 public partial class Form1 : Form


    Person[] listPersons = new Person[0];
    public Form1()
    
        InitializeComponent();
        dataGridView1.DataSource = listPersons;
    

    private void button1_Click(object sender, EventArgs e)
    
        if (textBox1.Text.Length > 0)
        
            Person p = new Person();
            p.Name = textBox1.Text;
            Array.Resize<Person>(ref listPersons, listPersons.Length+1);
            listPersons[listPersons.Length-1]=p;
            dataGridView1.DataSource = listPersons;
        

    



class Person

    public string Name  get; set; 

【讨论】:

【参考方案5】:

我认为您不能直接将列表绑定到 datagridview。 而是使用 BindingList。

public partial class Form1 : Form

    BindingList<Person> lstBinding;
    public Form1()
    
        InitializeComponent();
        lstBinding = new BindingList<Person>();
        dataGridView1.DataSource = lstBinding;
    

    private void button1_Click(object sender, EventArgs e)
    
        if (textBox1.Text.Length > 0)
        
            Person p = new Person();
            p.Name = textBox1.Text;
            lstBinding.Add(p);
            FillGrid();
        
    
    private void FillGrid()
    
        dataGridView1.DataSource = lstBinding;
    


class Person

    private string name;
    public string Name 
     
        get return name;
        set  name = value;  
    

【讨论】:

【参考方案6】:

添加到列表后尝试调用dataGridView1.Refresh();

【讨论】:

以上是关于将 DataGridView 绑定到 List<T> 不显示数据的主要内容,如果未能解决你的问题,请参考以下文章

winForms + DataGridView 绑定到 List<T>

DataGridView绑定list的注意事项

在 WinForm 中将 List<T> 绑定到 DataGridView

如何使用 DataGridViewAutoFilter 库将 List<DisplayedInfo> 绑定到 datagridview?

如何为绑定到 List<T> 的 dataGridView 设置 columnNames?

实体框架:绑定到 DataGridView 的 List<T> 添加回已删除对象以查看