Winforms如何绑定到列表<long> DatagridView并使其正确显示</long>

时间:2014-05-07 01:18:49

标签: c# .net winforms datagridview

所以我需要在网格中显示人们输入的数字列表,以帮助他们仔细检查他们的工作。它几乎可以工作,除了它没有显示数字。我的设置很简单。我有一个文本框,他们输入数字,当点击添加按钮时,它被添加到BindingList,然后用作DataGridView的数据源。

所以,在Stackoverflow Post的帮助下,我得到了一半的工作。 不幸的是,即使它似乎每次都没有正确显示值时添加一行Grid。 它将新行显示为空。

这是我的代码。

   public partial class ManualEntry : Form
   {

    BindingList<long> ProjectIDs;
    public ManualEntry()
    {
        InitializeComponent();
        ProjectIDs = new BindingList<long>();
    }

单击添加按钮后,将执行此操作。

        private void AddButton_Click(object sender, EventArgs e)
        {
            try
            {
               long temp = long.Parse(textBox1.Text);
               ProjectIDs.Add(temp);
               ProjectsGrid.DataSource = ProjectIDs;
               textBox1.Text = "";//clear the textbox so they can add a new one.
            }
            catch//bring up the badinput form
            {
                BadInput b = new BadInput();
                b.Show();
            }

        }

所以这是添加几个数字的结果。

add project

如果您需要我的任何其他代码来帮助您回答问题,请询问。

2 个答案:

答案 0 :(得分:3)

您还没有告诉DataGridViewColumn要绑定的内容。

通常绑定到绑定数据类型的公共属性。在这种情况下,您的数据类型为long,它没有适当的属性可以绑定。

将您的long包装在自定义类中,并将其作为公共属性公开。

public class Data
{
    public long Value { get; set; }
}

将列绑定到Value属性。您可以在设计器中执行此操作,但这里是代码:

Column1.DataPropertyName = "Value";

现在使用long代替Data

ProjectIDs = new BindingList<Data>();

...

long temp = long.Parse(textBox1.Text);
ProjectIDs.Add(new Data { Value = temp });

答案 1 :(得分:1)

以下文章讨论了这个问题:

DataGridView bound to BindingList does not refresh when value changed

看起来绑定列表中的数据类型需要支持INotifyPropertyChanged接口:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

注意:修改 - 我对INotifyPropertyChanged的使用不正确,似乎也不需要。 现在这个答案基本上就像Igby一样 - 所以我认为他是更好的答案:)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
         ProjectIDs = new BindingList<AwesomeLong>();
         var source = new BindingSource( ProjectIDs, null );
         dataGridView1.DataSource = source;
         dataGridView1.Columns.Add( new DataGridViewTextBoxColumn() );
      }

      BindingList<AwesomeLong> ProjectIDs;
      private int i = 0;
      private void button1_Click( object sender, EventArgs e )
      {
         i++;
         ProjectIDs.Add(new AwesomeLong(i));
      }

   }

   public class AwesomeLong
   {
      public long LongProperty { get; set; }

      public AwesomeLong( long longProperty )
      {
         LongProperty = longProperty;
      }    
   }
}