Виртуальный режим DataGridView с простым списком в качестве источника

Ранее я задавал вопрос о производительности моего dataGridView из-за его привычного отображения большого количества строк, которые добавляются на основе входящего потока. Было предложено несколько решений, одно из которых включало виртуальный режим. В MSDN есть статья на эту тему, но она кажется более сложной, чем мне нужно, поскольку она использует базу данных и редактируемое поле. Мой DataGridView предназначен только для отображения, а отображаемые данные помещаются в список.

После того как я принял ответ, я получил эту ссылку:http://www.codeproject.com/Articles/23937/Paging-Data-with-DataGridView-in-VirtualMode , Несмотря на то, что здесь используется пример базы данных, он лучше подходит для того, что мне нужно. Мой список, который будет содержать данные, которые я хочу отобразить, объявлен следующим образом:

<code>List<ResultRow> captureResults = new List<ResultRow>();
</code>

Объект ResultRow определяется следующим образом:

<code>/* Simplified */
public class ResultRow
{
    private int first = 0;
    private string second = "";
    private UInt64 third = 0;
    private IPAddress fourth = null;
    /* etc */

    public ResultRow()
    {
    }

    public void Set (<the values>) //In actuallity a KeyValuePair
    {
        //field gets set here
    }

    public UInt64 Third
    {
        get { return third; }
        set { third = value; }
    }

    /* etc. */
</code>

}

После статьи, упомянутой выше, я создал ResultRowCache. Объект выполнен следующим образом:

<code>/* Page size set to 100. */
ResultRowCache _cache   = new ResultRowCache(PAGE_SIZE, captureResults);
</code>

В форме «Событие загрузки» я делаю следующее (связано с этой проблемой. Я также добавил обработчик события, хотя это было сделано с использованием среды IDE, поэтому не отображается непосредственно в этом коде. Определение ниже!)):

<code>dataGrid.VirtualMode = true;

_cache = new ResultRowCache(PAGE_SIZE, captureResults);

dataGrid.Columns.Add("FirstColumn"  , "First column header");
dataGrid.Columns.Add("Second Column", "Second column header");
/* Etc. Adding all columns. (Every member or ResultRow has it's own column. */

dataGrid.RowCount = (int)_cache.TotalCount;
</code>

Мне интересно, как здесь инициализируется RowCount. Вероятно, он равен 0 (из-за вызова конструктора ResultRowCache (см. Ниже)), но, похоже, он никогда не изменится снова. Это назначение считается ссылкой? Как это само обновляется?

В любом случае, с тем, что у меня есть, ResultRowCache определяется следующим образом:

<code>public class ResultRowCache
{
    public int  PageSize    = 100;
    public long TotalCount;
    public List<ResultRow> CachedData = null;
    private List<ResultRow> FullData;

    int _lastRowIndex = -1;

    public ResultRowCache (int pageSize, List<ResultRow> total)
    {
        PageSize = pageSize;
        FullData = total;

        LoadPage( 0 );
    }

    public void LoadPage (int rowIndex)
    {
         int lastRowIndex = rowIndex - ( rowIndex % PageSize );

         /* Page already loaded */
         if( lastRowIndex == _lastRowIndex ) return;

         /* New page */
         _lastRowIndex = lastRowIndex;

         /* Create a new cashes data object */
         if( CachedData == null ) CachedData = new List<ResultRow>();

         /* If cached data already existed, clear */
         CachedData.Clear();

         /* The index is valid (there is data */
         if (lastRowIndex < FullData.Count)
         {
             /* Not a full page */
             if (lastRowIndex + PageSize > FullData.Count)
             {
                 CachedData = FullData.GetRange(lastRowIndex, ((lastRowIndex + PageSize) - 1) - FullData.Count);

             }
            /* Full page */
            else
            {
                CachedData = FullData.GetRange(lastRowIndex, PageSize);
            }
        }

        TotalCount = CachedData.Count;
    }
    }
}
</code>

Наконец, мое событие CellValueNeeded для сетки данных определяется следующим образом:

<code>void DataGridCellValueNeededEvent(object sender, DataGridViewCellValueEventArgs e)
{
    _cache.LoadPage(e.RowIndex);

    int rowIndex = e.RowIndex % _cache.PageSize;

    switch (dataGrid.Columns[e.ColumnIndex].Name)
    {
        /* Not actual names, example */
    case "FirstColumn":   e.Value = _cache.CachedData[rowIndex].First;  break;
        case "SecondColumn":  e.Value = _cache.CachedData[rowIndex].Second; break;
        /* Rest of the possibly columns/ResultRow values */
    }
}
</code>

Проблема: моя сетка данных остается пустой, хотя & quot; captureResults & quot; список заполняется. Вот что я пробовал до сих пор:

Update the RowCount member of the datagrid after the switch in the event. Declare the list with the total amount of results within the cache to ensure it's always up to date. (I was afraid "outside modifications" wouldn't go through to the List i passed in the cached constructor even though it was a reference. (Fairly new with C#)) Set the RowCount of the datagrid to 100 (hard value) in the form's load event. Added an "Update()" call to the datagrid after adding something to the captureResults list. (this happens from a special thread which Invoke's a function that adds something to the list)

Ничто из вышеперечисленного не изменило ничего. Сетка остается пустой. Я думаю, что упускаю что-то совершенно очевидное Какие-либо предложения?

-edit- Добавлено что-то, что я пытался заставить это работать.

Ответы на вопрос(1)

Ваш ответ на вопрос