2012-05-22 3 views
1

Я немного оглянулся, и, похоже, ничто не отвечает на мой вопрос. У меня есть DataGridView, в котором я добавляю строки и столбцы, зависящие от определенного количества записей геопространственных данных, которые хранятся в ArcGIS. Затем данные передаются в gridview для редактирования.VB.NET DataGridView, не отображающий данные

Поэтому я не использую методы привязки данных, а это очень ручной процесс. Я храню данные в двумерных массивах, индексы которых основаны на данных определенных данных.

После завершения циклов данные должны храниться в каждой ячейке в зависимости от индекса. Самая последняя заполненная строка заполняется отлично, но остальные 72 (или около того) строки пустые.

Вот код следующим образом:

Это заполнит заголовки столбцов (отлично работает):

For i_FieldNum = 0 To pFields_1.FieldCount - 1 

     str_FieldName = UCase(pFields_1.Field(i_FieldNum).Name) 
     str_FieldAliasName = pFields_1.Field(i_FieldNum).AliasName 

     ReDim Preserve m_array_str_FieldNames(i_FieldNum) 
     ReDim Preserve m_array_str_FieldAliasNames(i_FieldNum) 
     m_array_str_FieldNames(i_FieldNum) = str_FieldName 
     m_array_str_FieldAliasNames(i_FieldNum) = str_FieldAliasName 

     i_FieldCount = i_FieldCount + 1 
     i_ColNum = i_FieldCount - 1 

     'If this is the "SHAPE", "FID", or "OBJECTID" field, remember it: 
     If (str_FieldName = "SHAPE") Then 
      m_i_FieldNum_Shape = i_FieldCount - 1 
     ElseIf (str_FieldName = "FID") Then 
      m_i_FieldNum_FID = i_FieldCount - 1 
     ElseIf (str_FieldName = "OBJECTID") Then 
      m_i_FieldNum_OBJECTID = i_FieldCount - 1 
     End If 

     'Store the field name in the top row: 
     grid_Data.ColumnCount = i_FieldCount 
     grid_Data.Columns.Item(i_ColNum).HeaderText = str_FieldName 

     ReDim Preserve m_array_l_FieldColLengths(i_ColNum) 
     m_array_l_FieldColLengths(i_ColNum) = pFields_1.Field(i_FieldNum).Length 

    Next i_FieldNum 

Это заполнит двумерный массив:

Do Until pFeat_1 Is Nothing 
     'Until we run out of features ... 

     i_FeatCount = i_FeatCount + 1 


     For i_FieldNum = 0 To pFields_1.FieldCount - 1 

     'If the field is recorded as a shape 
      If (i_FieldNum = m_i_FieldNum_Shape) Then 
       array_Data(i_FeatCount - 1, i_FieldNum) = "<Shape>" 
      Else 

     'If the value of the field is null 
       If IsNothing(pFeat_1.Value(i_FieldNum)) Or pFeat_1.Value(i_FieldNum).ToString = "" Then 
        array_Data(i_FeatCount - 1, i_FieldNum) = "<Null>" 
       Else 

        array_Data(i_FeatCount - 1, i_FieldNum) = pFeat_1.Value(i_FieldNum).ToString 
       End If 
      End If 

     Next i_FieldNum 

     'End If 

     'Move to the next feature (if any). 
     pFeat_1 = pFeatCursor_1.NextFeature 


    Loop 

Предположительно, чтобы отобразить данные:

For i_RowNum = 0 To i_FeatCount - 1 

     'Add a new row to the grid: 
     grid_Data.RowCount = i_RowNum + 2 

     For i_ColNum = 0 To pFields_1.FieldCount - 1 

      grid_Data.Item(i_ColNum, i_RowNum + 1).Value = array_Data(i_RowNum, i_ColNum) 

     Next i_ColNum 

    Next i_RowNum 

Все работает и компилирует прекрасно, хотя, как я уже говорил ранее, только данные последней строки является показано (который населяли правильно).

Если кто-то может помочь выяснить, почему только одна строка заполнена, она будет более чем оценена.

Спасибо,

Логан

+0

Должен признаться, что я не могу видеть это. В стороне, хотя если вы установите grid_data.RowCount на i_FeatCount вне цикла, вы получите повышение производительности. –

+0

Спасибо за совет.Это сводит меня с ума. Я просидел все итерации, проверяя каждую ценность. Взял мне 4 с половиной часа. Спасибо за вашу помощь. –

+0

У меня будет попытка, я вижу, что вы пришли из фона VB6, если не все еще в версии 1.1 .Net. Я бы рекомендовал вам перейти от массивов ReDim'ing к использованию дженериков, например: List (of Class). Даже использование DataTable было бы намного легче читать. Совет. Венгерская нотация не нужна с .Net. –

ответ

2

Проверьте обновленный раздел - Это, предполагают, чтобы отобразить данные: Если ваши данные правильно установлен, то в соответствии с моей догадке, что делает сетки показать неправильные данные. Измените его в соответствии с вашими столбцами в вашей сетке, которые вы добавили. Или вы можете создать строковый массив имен столбцов, чтобы помещать данные в определенные ячейки. в dgvr.Cells(columnsArray[index]).Value = array[,]

For i_RowNum = 0 To i_FeatCount - 1 

     'Add a new row to the grid: 
     DataGridViewRow dgvr = new System.Windows.Forms.DataGridViewRow(); 
     dgvr.CreateCells(grid_Data) 

     For i_ColNum = 0 To pFields_1.FieldCount - 1 
      dgvr.Cells(i_ColNum).Value = array_Data(i_RowNum, i_ColNum) 
     Next i_ColNum 
     grid_Data.Rows.Add(dgvr) 
Next i_RowNum 

Ref: Adding a New Row to DataGridView и How to: Manipulate Rows in the Windows Forms DataGridView Control

+0

Ты, мой друг, только что исправил мою проблему. И это быстро;). Огромное спасибо. –

0

Смотрите здесь, каждый раз, когда вы увеличиваете количество строк его очистки данных:

DataGridView1.RowCount += 1 
DataGridView1.Item(0, 0).Value = "a value" 
DataGridView1.RowCount += 1 
DataGridView1.Item(0, 1).Value = "the previous value has been wiped" 

Чтобы исправить код без каких-либо серьезных изменений, просто использовать этот метод для добавления строк:

grid_Data.Rows.Add(paramArray) 

или даже проще поставить эту линию над петли и установите количество строк, прежде чем заполнить их:

grid_Data.RowCount = i_FeatCount - 1 
Смежные вопросы