2016-10-25 3 views
0

У меня есть DataGridView, который я заполняю из SQL Query (если есть какие-либо данные уже в таблице). У меня есть кнопка «Сохранить и обновить», если изменения сделаны, пользователь может сохранить любые изменения или перенести все сделанные. Однако ..DataGridView привязан к SQL - программно добавляет строки

У меня есть еще одна кнопка, которая переносит их в другую форму, где они могут вводить детали, которые нужно вставить в DataGridView. Это где я получаю проблему, я получаю ошибку ниже:

Rows cannot be programmatically added to the datagridview's row collection when the control is data-bound

Экстракты моего кода ниже, какие-либо идеи? Мне нужно, чтобы DataGridView редактировался, когда кнопка «Сохранить» обновляет таблицу SQL, но мне также нужно иметь возможность вставлять строки из другой формы, где кнопка «Сохранить» также обновляет (вставляет) это.

Форма 1 Код:

Imports System.Data 

Public Class AuditForm 

Private DAdapter As New SqlClient.SqlDataAdapter() 
Private BSource1 As New BindingSource() 


Private Sub AuditForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim EmployeeDataset As New DataSet 
    Dim sSQL As String 
    If LoadSettings() = False Then 
     MsgBox("Error: Unable to Load Settings", vbOKOnly + vbCritical) 
     Me.Close() 
    End If 
    With DG_Audit 
     'General GridView Settings 
     .AutoGenerateColumns = False 
     .AllowUserToAddRows = False 
     .AllowUserToDeleteRows = True 
     .AllowUserToOrderColumns = False 
     .MultiSelect = False 
     .SelectionMode = DataGridViewSelectionMode.FullRowSelect 
     .ReadOnly = False 
     .DataSource = BSource1 

     'General GridView Formatting 
     .RowsDefaultCellStyle.BackColor = Color.White 
     .AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray 
     .RowHeadersDefaultCellStyle.SelectionBackColor = Color.Khaki 
     .DefaultCellStyle.SelectionBackColor = Color.Khaki 
     .DefaultCellStyle.SelectionForeColor = Color.Black 
    End With 

End Sub 




Private Sub BTLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTLoad.Click 
    GetData("SELECT * FROM AdminCS_Audit WHERE Audit_CUser = '" & AdminCB.Text & "' " & 
      "AND Audit_Submitted IS NULL") 
End Sub 

Private Sub BTSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTSave.Click 
    DAdapter.Update(CType(BSource1.DataSource, DataTable)) 
    'DAdapter.Update(CType(DG_Audit.DataSource, DataTable)) 
End Sub 

Sub GetData(ByRef cmd As String) 
    Try 
     Dim cnt As String = gConnection 
     DAdapter = New SqlClient.SqlDataAdapter(cmd, cnt) 
     Dim cmdBuilder As New SqlClient.SqlCommandBuilder(DAdapter) 
     Dim AuditData As New DataTable() 
     AuditData.Locale = System.Globalization.CultureInfo.InvariantCulture 
     DAdapter.Fill(AuditData) 
     BSource1.DataSource = AuditData 
    Catch ex As Exception 
     MsgBox(ex.Message, vbOKOnly + vbCritical, "SQL Error") 
    End Try 
End Sub 

End Class 

Форма 2 Код, который будет где новая строка будет добавлена ​​от: Imports System.Data

Public Class AuditDetailAdd 
Private Sub btOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOK.Click 
    Dim PassFail As String 
    If RB_Passed.Checked = True Then 
     PassFail = "Pass" 
    ElseIf RB_Failed.Checked = True Then 
     PassFail = "Fail" 
    Else 
     PassFail = "" 
    End If 

    AuditForm.DG_Audit.Rows.Add(Nothing, Nothing, TickForm.AdminCB.Text, CB_Field.Text, L_Action.Text, L_Time.Text, TB_Reason.Text, PassFail, TB_Comments.Text) 
    Me.Close() 
End Sub 
End Class 

ответ

0

я получил ниже для работы в конце:

Private Sub btOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOK.Click 
    Dim PassFail As String 
    If RB_Passed.Checked = True Then 
     PassFail = "Pass" 
    ElseIf RB_Failed.Checked = True Then 
     PassFail = "Fail" 
    Else 
     PassFail = "" 
    End If 
    Dim DR As DataRow = CType(TickForm.BSource.DataSource, DataTable).NewRow 
    DR.Item(0) = DBNull.Value 
    DR.Item(1) = Date.Today 
    DR.Item(2) = TickForm.AdminCB.Text 
    DR.Item(3) = CB_Field.Text 
    DR.Item(4) = L_Action.Text 
    DR.Item(5) = DateTime.Parse(L_Time.Text) 
    If Not String.IsNullOrEmpty(TB_Reason.Text) Then 
     DR.Item(6) = TB_Reason.Text 
    Else 
     DR.Item(6) = DBNull.Value 
    End If 
    DR.Item(7) = PassFail 
    If Not String.IsNullOrEmpty(TB_Comments.Text) Then 
     DR.Item(8) = TB_Comments.Text 
    Else 
     DR.Item(8) = DBNull.Value 
    End If 
    CType(TickForm.BSource.DataSource, DataTable).Rows.Add(DR) 

    Me.Close() 
End Sub 
Смежные вопросы