2014-12-07 2 views
0

텍스트 파일에서 datagridview로 읽는 프로그램이 있는데이 파일은 저의 예산 프로그램에서 가져온 것입니다. 그런 다음 매주마다 매주 한 행을 삽입하려고합니다. 이 작업을 수행하는 유일한 방법은 DataGridView1.Rows.Count입니다. 이 문제는 테이블에 3,000 개의 행이 있고 1,000 개를 삽입한다고 가정 해 봅시다. count 메소드를 사용하면 1,000 행을 삽입 한 후 총 2,000 행을 계산합니다.이 행은 2,000 행에 있습니다. 2,000 + 1,000 = 3000 카운트가 삽입 되었기 때문입니다. count 메소드가 행의 인덱스를보고 있고 행이 삽입 될 때마다 인덱스가 1 씩 증가합니다.DataGridview에 행을 삽입하는 다른 방법은 무엇입니까

다음은이 메소드를 테스트하기 위해 작성한 작은 샘플 프로그램입니다.

Dim RowValue() As String = {"Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6", "Line 7", "Line 8", "Line 9", "Line 10"} 
    For x = 0 To 9 
     DataGridView1.Rows.Insert(x, RowValue(x)) 
    Next 

    Dim y As Integer = 0 
    Dim RowCount As Integer = DataGridView1.Rows.Count - 1 
    For count = 1 To RowCount Step 2 
     Dim InsertValue() As String = {"Insert 1", "Insert 2", "Insert 3", "Insert 4", "Insert 5", "Insert 6", "Insert 7", "Insert 8", "Insert 9", "Insert 10"} 
     DataGridView1.Rows.Insert(count) 
     DataGridView1.Rows(count).Cells(1).Value = InsertValue(y) 
     y += 1 
    Next 

내가 런타임에 10 개 행을 작성하고 10 행을 삽입하기 위해 노력하고있어 볼 수 있지만 그것은 단지 내가 행을 삽입 있지만이없는의 RowCount에 때마다 1을 추가하는 시도 5. 삽입으로 선을 삽입하는 방법에 영향을줍니다.

DataGridview의 끝까지 갈 수있는 행을 삽입하는 또 다른 방법이 있습니까? 예를 들어

Do Until (last row of datagridview) 
    (do something here) 
Loop 

답변

0

정확하게 대답 할 수있는 정보가 너무 적습니다. 그러나 여기에는 몇 가지 지침이 있습니다.

DataGridView는 VIEW 개체이므로 그대로 사용해야합니다. 행하고있는 것처럼 행을 수동으로 추가 할 필요가 없습니다. 먼저 데이터를 가져와 구성한 다음 DGV에 바인딩하십시오. 특히 훨씬 많은 행이있을 때 더욱 효율적입니다.

또한이 경우 행을 추가하는 것은 의미가 없습니다. DataGridView는 기본적으로 그룹화를 지원하지 않지만 사용 그룹화 및 집계를 수행해야합니다. 그러나 확장자가 있습니다 (예 : http://10tec.com/articles/datagridview-grouping-two-recipes.aspx).

그룹화를 수행하지 않으려면 데이터 소스에 추가 열을 추가하고 거기에 합계를 넣어야합니다.

이 소스 파일을 가정 :

"RowId","RowAmount","WeekId" 
1,1,1 
2,2,1 
3,3,1 
4,4,2 
5,5,2 
6,6,2 
7,7,3 
8,8,3 
9,9,3 

이 내가 무엇을 할 것이라고한다 (그러나 마음 그룹을 유지하는 것은 ... 시각적 기능적으로 훨씬 더 낫다) :

Private Sub LoadDataInDgv() 
    Dim sourceFilename As String = "c:\source.txt" 

    Dim dt As DataTable = ReadCsv(sourceFilename, ",", True, "WeekId ASC, RowId ASC") 

    AddWeeklyTotals(dt) 

    DataGridView1.DataSource = dt 
End Sub 

Private Sub AddWeeklyTotals(ByRef dt As DataTable) 
    If dt.Rows.Count = 0 Then Exit Sub 

    Dim row As Integer = 0 
    Dim previousWeekId = CInt(dt.Rows(row)("WeekId")) 

    dt.Columns.Add("WeeklyTotal", GetType(Double)) 

    Dim runningTotal As Double = 0 

    For row = 0 To dt.Rows.Count - 1 
     Dim currentWeekId = CInt(dt.Rows(row)("WeekId")) 
     Dim rowAmount = CDbl(dt.Rows(row)("RowAmount")) 

     If currentWeekId <> previousWeekId Then 
      dt.Rows(row - 1)("WeeklyTotal") = runningTotal 
      runningTotal = rowAmount 
      previousWeekId = currentWeekId 
     Else 
      runningTotal += rowAmount 
     End If 

     If row = dt.Rows.Count - 1 Then dt.Rows(row)("WeeklyTotal") = runningTotal 

    Next 
End Sub 


Private Function ReadCsv(ByVal filename As String, ByVal delimiter As Char, ByVal hasHeaders As Boolean, ByVal orderByExp As String) As DataTable 
    Dim result As New DataTable 

    Dim fi As New System.IO.FileInfo(filename) 

    Dim connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & fi.DirectoryName & """;Extended Properties='text;HDR=" & If(hasHeaders, "Yes", "No") & ";FMT=Delimited(" & delimiter & ")';" 
    Dim cmdStr As String = "SELECT * FROM [" & fi.Name & "]" & If(String.IsNullOrWhiteSpace(orderByExp), "", " ORDER BY " & orderByExp) & ";" 

    Using Conn As New System.Data.OleDb.OleDbConnection(connStr) 
     Using Cmd As New System.Data.OleDb.OleDbCommand(cmdStr, Conn) 
      Using Adapter As New System.Data.OleDb.OleDbDataAdapter(Cmd) 
       Adapter.Fill(result) 
      End Using 
     End Using 
    End Using 

    Return result 
End Function 

그리고 결과 :

enter image description here

+0

정말 확장을 사용하고 싶지,하지만 추가하지 마십시오 총계 열에 합계를 추가하면됩니다. 감사. – BrianC987

관련 문제