【发布时间】: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.consoleBinding是BindingSource实例吗?consoleSource.Binding是什么?
标签: .net winforms visual-studio c#-4.0