2011-11-01 90 views
-1

新問題!從datagridview複選框到文本框

我在datagridview中有一個複選框列,還有一個名爲「partqty」的列,它顯示了可用的matera資源數量。我希望當用戶選中複選框時,應該添加已檢查行的數量,在文本框中顯示..

我厭倦了這樣的事情。但它顯示爲0的文本框(零)。請幫助..

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click 

     'For Each _rw As DataGridViewRow In dataGridView1.Rows 
     ' If _rw.Cells(0).Value = True Then 

     Dim totalSum As Integer 

     For i As Integer = 0 To HemDatabase1DataSet5.Tables(0).Rows.Count - 1 
      totalSum += HemDatabase1DataSet5.Tables(0).Rows(i).Item("partqty") 
     Next 

     textBox5.Text = totalSum.ToString() 
     ' End If 
     'Next 
    End Sub 

嘿!這是我可以想到的嘗試!然而,在編譯時沒有錯誤,但在運行時出現錯誤,它表示: 運算符'+'未針對類型'DBNull'進行定義並且類型爲'布爾'

這是我試過的代碼:

For Each _rw As DataGridViewRow In dataGridView1.Rows 
      If _rw.Cells(0).Value = True Then 

       Dim totalSum As Integer 

       For i As Integer = 0 To dataGridView1.Rows.Count - 1 
        totalSum += dataGridView1.Rows(i).Cells(5).Value 
       Next 

       textBox5.Text = totalSum.ToString() 
      End If 
     Next 

它詳細介紹了此行錯誤:

totalSum += dataGridView1.Rows(i).Cells(5).Value 

回答

2

你的第一個問題是,你正試圖添加蘋果和橘子一起。

在行:

totalSum += dataGridView1.Rows(i).Cells(5).Value 

totalSum是一個整數,而一個DataGridView細胞的Value屬性是object類型。

這與您在嘗試使用DataTable時看到的類似問題除了您的Item屬性爲您提供DBNull而不是對象後退之外。這裏是你想要的代碼(我主要是一個C#開發,所以VB.Net可能缺乏優雅,但它的工作原理)。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim sum As Integer 
    sum = 0 

    For Each row As DataGridViewRow In DataGridView1.Rows 
     Dim current As Integer 

     If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then 
      sum += current 
     End If 
    Next 
    TextBox1.Text = sum.ToString 
End Sub 

有些事情值得一提的有關代碼:

  • 我使用For Each,而不是一個。這兩個表現基本相同,但我發現foreach更具可讀性。
  • 在使用它之前,我在單元格值上使用了Integer.TryParse。這比僅僅直接施加單元格值更安全。
  • 而不是使用列索引這是有點脆弱我使用列名稱。

隨着的複選框是否被選中,你可以做同樣的事情你的檢查:

Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) 

最後一點要注意的是,如果你試圖在cellclick執行這段代碼DataGridView的方法會遇到問題 - 複選框狀態只有在單擊單元格之後纔會提交,因此最近檢查的單元格不會添加到您的計數中。相反,您需要處理CellDirtyStateChanged並提交編輯,然後在CellValueChanged處理程序中執行求和。

爲了說明試試這個代碼:

Private Sub dgv_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick 
    Dim sum As Integer 
    sum = 0 

    Dim cb As Boolean 
    cb = False 

    If DataGridView1.Columns(e.ColumnIndex).Name <> "IsChecked" Then 
     Return 
    End If 


    For Each row As DataGridViewRow In DataGridView1.Rows 
     If Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) Then 
      If cb Then 
       Dim current As Integer 

       If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then 
        sum += current 
       End If 
      End If 
     End If 
    Next 
    TextBox1.Text = sum.ToString 
End Sub 

總和將始終落後點擊後面的(實際上在VB.Net它似乎只是也不真正的工作 - 但我更AC#開發,使可能是我錯過了一些東西)。

相反,你想:

Sub dataGridView1_CurrentCellDirtyStateChanged(_ 
    ByVal sender As Object, ByVal e As EventArgs) _ 
    Handles DataGridView1.CurrentCellDirtyStateChanged 

    If DataGridView1.IsCurrentCellDirty Then 
     DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) 
    End If 
End Sub 

' If a check box cell is clicked, this event handler disables 
' or enables the button in the same row as the clicked cell. 
Public Sub dataGridView1_CellValueChanged(ByVal sender As Object, _ 
    ByVal e As DataGridViewCellEventArgs) _ 
    Handles DataGridView1.CellValueChanged 

    If DataGridView1.Columns(e.ColumnIndex).Name = "IsChecked" Then 
     Dim sum As Integer 
     sum = 0 

     Dim cb As Boolean 



     For Each row As DataGridViewRow In DataGridView1.Rows 
      If Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) Then 
       If cb Then 
        Dim current As Integer 

        If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then 
         sum += current 
        End If 
       End If 
      End If 
     Next 
     TextBox1.Text = sum.ToString 
    End If 
End Sub 
+0

+1我認爲你釘了它。 – ChrisBD

+0

嗯,我把這個代碼在按鈕單擊事件..我也第一次嘗試vb.net,所以謝謝你的所有解釋..它有助於更​​新自我..我vl試試這個,很快恢復..再次Thanx ! :) – Ruchi22

+0

嘿..這似乎並沒有爲我工作..我使用此代碼,並嘗試了一些修改將它放在按鈕單擊事件!你能幫我修改我的代碼嗎?我發佈的代碼的第二部分是我正在使用的!謝謝你:) :) – Ruchi22

0

這是工作的代碼..

Dim iSselected As Boolean 
     Dim CurrentCellValue As String 
     Dim CumulativeSummer As Integer 
     Dim i As Integer 

     With Me.dataGridView1 
      For i = 0 To .RowCount - 1 
       iSselected = .Rows(i).Cells(0).Value 
       CurrentCellValue = .Rows(i).Cells(5).Value 
       If CurrentCellValue = "" Then CurrentCellValue = 0 

       If iSselected = True Then 
        CumulativeSummer += Convert.ToInt32(CurrentCellValue) 
       End If 
      Next 
     End With 

     Me.textBox5.Text = CumulativeSummer 

感謝ü您的幫助! :)