Binding DataGridView to List <t>不显示数据</t>

时间:2012-12-24 19:06:54

标签: c# winforms list generics datasource

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

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

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

我已尝试将AutoGenerateColumnsVirtualMode设置为true,但这也无法解决问题。

6 个答案:

答案 0 :(得分:3)

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

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

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

你已经完成了。我几年没有看过这个来源,但我相信它包含了List&lt; T&gt;使用实现IBindingList的类。

答案 1 :(得分:2)

但如果我只使用BindingList<T>代替List<T>,那么它确实有效。

示例代码:

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

但是我仍然想知道如何在将它与List绑定后在DataGridView中显示数据。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为你不能直接将列表绑定到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; } 
    }
}

答案 4 :(得分:0)

使用数组绑定datagridview即

 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 :(得分:-1)

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