Отображение списка объектов пользователя в DataGridView - PullRequest
0 голосов
/ 23 августа 2011

Мы являемся 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 и находили множество примеров для привязки к базам данных и ручного обновления сетки данных, но очень мало информации о программном добавлении данных в сетку данных через хранилище данных поддержки.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 августа 2011

Поскольку мы не можем видеть весь ваш 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);
...