Мы являемся Java-разработчиками, пытающимися поддерживать проект на C #, и не можем понять, как связать список объектов, которые постоянно обновляются в пользовательском интерфейсе, с DataGridView, чтобы они были видны, как только они добавлены.
Существует требование, чтобы пользовательский интерфейс отслеживал его использование и отображал его пользователю в сетке данных (для анализа человеческого фактора). Мы реализуем интерфейс 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) содержит:
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 (a.k.a consoleSource). Все они записываются на диск позже, поэтому мы знаем, что метод Append вызывается и в остальном работает нормально.
Несколько голов:
- Мы стараемся придерживаться конструктора, а не связываться с сгенерированным кодом.
- Мы бы хотели связать привязку в методе Main ().
- Нам бы хотелось, чтобы открытые свойства класса LogEvent отображались в виде заголовков столбцов
- Это должно оставаться однопоточным приложением
Мы просматривали форумы и страницы MSDN и находили множество примеров для привязки к базам данных и ручного обновления сетки данных, но очень мало информации о программном добавлении данных в сетку данных через хранилище данных поддержки.
Любая помощь будет принята с благодарностью.