2017-04-26 141 views
-1

是的,我知道还有其他帖子,但我无法理解要更改或在哪里使解决方案适合我的代码。向DataGridView添加行

错误:

Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

代码:

Public Sub dsLoadEvents() 
    dsConnectionE = New OleDbConnection 
    dsConnectionE.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=DataSourceDB.accdb" 
    dsDataAdapterE = New OleDbDataAdapter 
    dsDataAdapterE.SelectCommand = New OleDbCommand 
    dsDataAdapterE.SelectCommand.Connection = dsConnectionE 
    dsDataAdapterE.SelectCommand.CommandText = "SELECT * FROM Event" 
    dsDataAdapterE.SelectCommand.CommandType = CommandType.Text 
    dsConnectionE.Open() 
    dsDataSetE = New DataSet 
    dsDataAdapterE.Fill(dsDataSetE, "dataSetEvents") 
    dsConnectionE.Close() 
    Form3.dgdEvents.AutoGenerateColumns = True 
    Form3.dgdEvents.DataSource = dsDataSetE 
    Form3.dgdEvents.DataMember = "dataSetEvents" 
End Sub 

这就是程序第一次打开时,事件被加载。我正在努力将数据添加到数据库,但我尝试使用以下代码将其添加到DataGridView,但它给了我上面的错误。

Form3.dgdMembers.Rows.Add(New String() {Form3.tbceid.Text, Form3.tbfn.Text, Form3.dtpesd.Value, Form3.dtpdob.Value, Form3.tbal2.Text, Form3.tbal1.Text, Form3.tbpgfn.Text, Form3.tbpgsn.Text, Form3.tbcpp.Text, Form3.tbelid.Text}) 
+2

可能重复的[当控件是数据绑定时,行无法以编程方式添加到datagridview的行集合](http://stackoverflow.com/questions/8708057/rows-cannot-be-programmatically-added-to- (datagridviews-row-collection-when) – Jerrad

+1

就像帖子说的那样,你应该将行添加到数据源(dsDataSetE),而不是数据网格(dgdMembers)。 – Jerrad

+0

@Jerrad我不明白。 – ItsSimplyEddie

回答

0

这里是我在类加载数据,传回一个数据集(我们可以只使用一个DataTable)的示例中,加载到数据表中的形式负载在DataGridView。

在按钮单击事件中,我们将DataGridView DataSource转换为DataTable并使用硬编码数据添加新行,但当然这可以像您一样从TextBox控件中获取。

Public Class Sample1 
    Private Builder As New OleDbConnectionStringBuilder With 
    { 
     .Provider = "Microsoft.ACE.OLEDB.12.0", 
     .DataSource = IO.Path.Combine(Application.StartupPath, "Database1.accdb") 
    } 
    Public Property dsDataSetE As DataSet 
    Public Function LoadCustomers() As DataSet 

     dsDataSetE = New DataSet 

     Using cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString} 
      Dim commandText As String = "SELECT Identifier, ContactTitle, Country, CompanyName FROM Customers" 
      Dim dsDataAdapterE = New OleDbDataAdapter(commandText, Builder.ConnectionString) 
      cn.Open() 
      dsDataAdapterE.Fill(dsDataSetE, "Customers") 
      dsDataSetE.Tables("Customers").Columns("Identifier").ColumnMapping = MappingType.Hidden 
     End Using 

     Return dsDataSetE 

    End Function 
End Class 

表格代码

Public Class StackOverFlowForm1 
    Private Operations As New Sample1 
    Private Sub StackOverFlowForm1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim ds As DataSet = Operations.LoadCustomers 
     DataGridView1.DataSource = ds.Tables("Customers") 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     CType(DataGridView1.DataSource, DataTable) _ 
      .Rows.Add(New Object() {Nothing, "Owner", "USA", "My company"}) 
    End Sub 
End Class 

上面是一个方法,将数据添加到数据绑定的DataGridView。我们可以将类中的代码放入表单中,但最好将后端操作与前端代码分开。

希望这会有所帮助。