【问题标题】:Displaying an IList of User Objects in a DataGridView在 DataGridView 中显示用户对象列表
【发布时间】:2011-08-22 22:16:57
【问题描述】:

我们是试图支持 C# 项目的 Java 开发人员,但似乎无法弄清楚如何将 UI 中不断更新的对象列表绑定到 DataGridView,以便它们一出现就可见已添加。

要求 UI 跟踪其使用情况并在数据网格中将其显示给用户(用于人为因素分析)。我们正在实现 IList 接口并继承我们的日志记录类之一:

public class DataSourceAppender : Logger, IList<LogEvent>
{
    private List<LogEvent> _events = new List<LogEvent>();

每次用户单击控件或执行一些感兴趣的操作时,我们都会向列表中添加(附加)一个新的 LogEvent 对象,并按发生时的顺序记录交互的各种细节。此列表在用户测试会话结束时转储到文件中以供分析。现在我们需要在会话进行时在数据网格中向用户显示。

我们的主要方法包含:

// create a new logger(appender) which holds all our log events
consoleSource = new DataSourceAppender();
consoleSource.Append("INIT", "Client Initialized");

// add the logger the the console data grid and wire-up the data binding
mainform.consoleDataGrid.AutoGenerateColumns = true;
mainform.consoleBinding.DataSource = typeof(LogEvent);
mainform.consoleBinding.DataSource = consoleSource;
consoleSource.Binding = mainform.consoleBinding;

DataSourceAppender (a.k.a consoleSource) 中的 append 方法包含:

public override void Append(string category, object entry)
{
    long now = (System.DateTime.Now.Ticks - 621355968000000000) / 10000;

    if (lastevent == 0) lastevent = now;

    try
    {
        LogEvent logevent = new LogEvent(now, category, (now - lastevent), Log.Interval, entry);

        // add the new log event to this data sorce
        lock (_events)
        {
            _events.Add(logevent);
        }
        if (_binding != null) _binding.ResetBindings(false);
    }
    catch (Exception e)
    {
        System.Console.Error.WriteLine(this.GetType().FullName + " error: " + e + ":" + e.Message);
    }
}

结果是第一个“INIT”条目显示在数据网格中,但没有显示 DataSourceAppender(也称为 consoleSource)中的其他事件。它们稍后都会写入磁盘,因此我们知道 Append 方法被调用并且工作正常。

几个目标:

  • 我们正努力坚持使用设计器,不要弄乱生成的代码。
  • 我们想在 Main() 方法中连接绑定。
  • 我们希望 LogEvent 类的公共属性显示为列标题
  • 这必须保持为单线程应用程序

我们一直在搜索论坛和 MSDN 页面,并找到大量用于绑定到数据库和手动更新数据网格的示例,但是关于通过其支持数据存储以编程方式将数据添加到数据网格的信息很少。

任何帮助将不胜感激。

【问题讨论】:

  • mainform.consoleBindingBindingSource 实例吗? consoleSource.Binding 是什么?

标签: .net winforms visual-studio c#-4.0


【解决方案1】:

由于我们看不到您的整个DataSourceAppender 课程,因此我无法确定您要做什么。

我看到您已将consoleSource 指定为您的数据源,因此您在网格中没有看到任何新添加的项目这一事实告诉我您没有正确实现IList 来包装_events

但无论如何,尝试实现IList 会使生活变得比必要的更加艰难。只需将 _events 指定为您的数据源。如果您愿意,可以将其公开为DataSourceAppender 的属性:

public IEnumerable<LogEvent> EventList { get { return _events; } }

然后:

mainform.consoleBinding.DataSource = consoleSource.EventList;

你也不需要这一行:

mainform.consoleBinding.DataSource = typeof(LogEvent);

基本上就是这样:

events = new Collection<LogEvent>(); // or List<> if you want
bindingSource.DataSource = events;
dataGridView.DataSource = bindingSource;

然后添加如下项目:

events.Add(event);
bindingSource.ResetBindings(false);

或者简单地说:

bindingSource.Add(event);

【讨论】:

  • 优秀的解决方案。我们将事件公开为 IList,以便其他代码访问 Count 属性并按照建议连接绑定。然后我们通过绑定源添加事件。用户今天早上批准了结果。 // 将记录器添加到控制台数据网格并连接数据绑定 mainform.consoleDataGrid.AutoGenerateColumns = true; mainform.consoleBinding.DataSource = consoleSource.EventList; consoleSource.Binding = mainform.consoleBinding;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2013-04-21
  • 2018-10-20
相关资源
最近更新 更多