【问题标题】:Binded DataGridView to List<T> not showing data将 DataGridView 绑定到 List<T> 不显示数据
【发布时间】: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,但这也没有解决问题。

【问题讨论】:

    标签: c# winforms list generics datasource


    【解决方案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();

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-24
            • 2014-05-12
            • 2010-09-12
            • 2013-05-17
            • 2010-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多