【问题标题】:Winforms How to Bind to a List<long> DatagridView and have it show correctlyWinforms 如何绑定到 List<long> DatagridView 并让它正确显示
【发布时间】:2014-06-23 19:13:37
【问题描述】:

所以我需要在网格中显示人们输入的数字列表,以帮助他们仔细检查他们的工作。它几乎可以工作,只是它不显示数字。我的设置很简单。我有一个文本框,他们输入数字,当单击添加按钮时将其添加到 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();
            }

        }

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

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

【问题讨论】:

  • 我也尝试使用绑定源作为 DataGridView 的数据源,但结果相同。

标签: c# .net winforms datagridview


【解决方案1】:

您还没有告诉 DataGridViewColumn 要绑定什么。

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

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

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

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

Column1.DataPropertyName = "Value";

现在你用Data代替long

ProjectIDs = new BindingList<Data>();

...

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

【讨论】:

  • 这听起来像是一种不必要的复杂方法来实现此结果。您能否展示一种仅手动添加 DataGridViewRow 的方法。如果我尝试 DataGridViewRow r = new DataGridViewRow(); r.Cells[0].Value = temp.ToString(); ProjectsGrid.Rows.Add(r);
  • 您在尝试之前添加了 datagridview 列吗?像这样:dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
  • @AlexanderRyanBaggett,请记住 DataGridView 旨在显示网格中对象(=一行)的多个信息(=属性)。它不仅仅是另一个 ListBox。如果您只想显示单个列,则可能需要使用 ListBox。只要您想显示两列或更多列,它就不会再以不必要的复杂方式出现......
  • @AlexanderRyanBaggett:基本上就是 elgonzo 所说的。这是使用 DataGridView 的标准方式,但如果您只有一个简单的值列表,则 DataGridView 本身可能是矫枉过正。
【解决方案2】:

以下帖子对此进行了讨论:

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

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2014-05-12
    • 2012-12-11
    • 2013-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2010-10-28
    • 2014-07-26
    相关资源
    最近更新 更多