【问题标题】:Bind multiple arrays to a datagridview将多个数组绑定到 datagridview
【发布时间】:2016-08-03 18:03:18
【问题描述】:

C#、.Net 4、VS2010

我有一个包含多个双精度数组的对象(最近将它们制成列表)。它看起来像:

public class Channel
{
    public List<DateTime> Date = new List<DateTime>();  //DateTime
    public List<double> Val1 = new List<double>();      //
    public List<double> Val2 = new List<double>();      //
    public List<double> Val3 = new List<double>();      //
    public List<double> Val4 = new List<double>();      //
}

所以现在我尝试用DataSource 填充DataGridView,但我只关心DateVal1Val2。我怎样才能做到这一点?

目前我正在遍历数组并将它们逐行添加到DataGridView。但这真的很慢,因为我有一个庞大的数据文件要处理。难道没有一种简单的方法来绑定我的数组并填充网格吗?我好像搞不懂。

谢谢

我试过的代码:

Channel ch = new Channel();

List<object> datasource = new List<object>();

dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();

datasource.Add(ch.spotsList[0].Date);
datasource.Add(ch.spotsList[0].Val1);
datasource.Add(ch.spotsList[0].Val2);

dataGridView1.DataSource = datasource;

我正在使用的代码可以运行,但速度很慢:

for (int i = 0; i < ch.spotsList[0].Date.Count; i++)
{
    dataGridView1.Rows.Add(ch.spotsList[0].Date[i].ToString("yyyy-MM-dd HH:mm:ss"), ch.spotsList[0].Val1[i].ToString("#.##"), ch.spotsList[0].Val2[i].ToString("#.##"));
}

【问题讨论】:

  • 仅供参考,List 和数组之间存在差异。无论如何,对如何将 List 绑定到 datagridview 进行简单的谷歌搜索,这是一个非常简单的任务 btw .. 在 Stackoverflow as well as the rest of the internet 上有很多现有示例 - 例如 stackoverflow.com/questions/6473326/…
  • 对,它们是数组,我使它们成为动态的列表。我已经用谷歌搜索了示例,但它仅适用于单个列表。我似乎找不到将多个 List 绑定到 datagridview(每列一个)的方法。
  • 也许您应该显示您尝试将 datagridview 绑定到列表的所有相关代码
  • 如何将所有单独的列表复制到一个列表中,然后将该新列表添加到您的 datagridview 中? stackoverflow.com/questions/4488054/…
  • 嗯,好主意。我刚试过这个: {List datasource = new List();数据源.Add(ch.spotsList[0].Date);数据源.Add(ch.spotsList[0].Val1);数据源.Add(ch.spotsList[0].Val2); dataGridView1.DataSource = datasource;} 但它给了我关于类型错误的错误。

标签: c# .net-4.0


【解决方案1】:

DataGridViews 并不是真正为按列结构化的数据模型设计的(例如您的)。相反,它们旨在与表示行的模型一起使用。您的编辑似乎表明您开始按照这些思路进行思考。特别是,希望您的新数据模型类似于

public class Channel
{
  private _listings = new List<SpotsList>();

  public IList<SpotsList> SpotsList { get { return _listings; } }
}

public class SpotsList
{
  public DateTime Date { get; set; }
  public double Val1 { get; set; }
  public double Val2 { get; set; }
  public double Val3 { get; set; }
  public double Val4 { get; set; }
}

在这种情况下,您应该可以通过调用将其加载到您的 DataGridView

Channel ch = new Channel();
// Add data to the channel
dataGridView1.DataSource = ch.SpotsList;

编辑

为了尝试更清楚地传达我的想法,下面的代码应该可以帮助您将您的方法映射到我的方法。

public class DataPoint
{
  public DateTime Date { get; set; }
  public double Val1 { get; set; }
  public double Val2 { get; set; }
}

// ... your other code ...

var dataSource = new List<DataPoint>();
for (int i = 0; i < ch.spotsList[0].Date.Count; i++)
{
  dataSource.Add(new DataPoint() 
  { 
    Date = ch.spotsList[0].Date[i],
    Val1 = ch.spotsList[0].Val1[i],
    Val2 = ch.spotsList[0].Val2[i]
  });
}
dataGridView1.DataSource = dataSource;

【讨论】:

  • 感谢您的回复,我认为您是对的。我认为问题是,我的每个 spotList 都有 N 个日期时间、val1、val2 等。所以我认为数据源的方法可能不可行。我可能只需要坚持我的 for 循环。谢谢
  • 我只是想像 mscharts 一样思考它。在 ms 图表中,我可以为每个系列数据绑定我的 x 和 y,这基本上是我在这里想要做的,我有 3 个共享日期时间的 val,所以我试图将我的所有值绑定到这个 datagridview。我正在玩数据集和数据表,看看有没有办法,但还没有想通。
  • 我了解您的想法。与 MsCharts 不同,DataGridViews 处理点 {x,y,z} 的列表比处理单独的 x、y 和 z 值列表更好。希望我对答案的编辑将有助于为这种方法提供更多灵感。
  • 谢谢,帮了大忙。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多