2014-05-07 33 views
1

因此,我需要在网格中显示人们输入的数字列表,以帮助他们仔细检查他们的工作。它几乎可以工作,但它不显示数字。我的设置很简单。我有一个文本框,他们输入数字,当添加按钮被点击时,它被添加到一个BindingList中,然后被用作DataGridView的数据源。Winforms如何绑定到列表<long> 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

如果你需要从我这里任何其他代码,以帮助您回答这个问题,只是问。

+0

我也尝试使用一个绑定源作为DataGridView的数据源,但我最终得到了相同的结果。 –

回答

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 }); 
+0

这听起来像是一种不必要的复杂方式来实现这一结果。你能否展示一种手动添加DataGridViewRow的方法。如果我尝试DataGridViewRow r = new DataGridViewRow();我得到一个索引超出范围异常。 r.Cells [0] .Value = temp.ToString(); ProjectsGrid.Rows.Add(r); –

+0

您在尝试此操作之前是否添加了datagridviewcolumn? 像这样:dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); – Derek

+2

@AlexanderRyanBaggett,请记住,DataGridView旨在显示网格中对象(=一行)的多个信息(=属性)。它不只是另一个ListBox。如果你只想显示一个列,你可能想要使用一个列表框。只要你想显示两列或更多的列,它不会出现一个不必要的复杂的方式了... – elgonzo

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; 
     }  
    } 
} 
相关问题