1

私はかなり見回しましたが、特に私の質問に答えるものは何もないようです。ArcGIS に保持されている地理空間データの特定のレコード数に応じて行と列を追加する DataGridView があります。その後、データは編集のためにグリッドビューに渡されます。

そのため、データバインディング メソッドは使用せず、非常に手作業のプロセスです。データを 2 次元配列に格納します。この配列のインデックスは、特定のデータ レコード数に基づいています。

ループが完了したら、インデックスに応じてデータを各セルに格納する必要があります。データが入力された最後の行は完全に入力されていますが、残りの 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

これにより、2 次元配列が生成されます。

 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

前に述べたように、すべてが完全に実行およびコンパイルされますが、最後の行のデータのみが表示されます (適切に入力されています)。

なぜ1行だけが入力されているのかを誰かが理解するのを手伝ってくれるなら、それは大歓迎です。

ありがとうございました、

ローガン

4

2 に答える 2

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

参照:新しい行を DataGridView に追加するおよび方法: Windows フォーム DataGridView コントロールで行を操作する

于 2012-05-25T06:49:31.523 に答える
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)

または、この行をforループの上に配置し、入力する前に行数を設定する方が簡単です。

grid_Data.RowCount = i_FeatCount - 1
于 2012-05-25T06:05:50.437 に答える