2017-04-26 15 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

[コントロールがデータバインドされているときに、プログラムでデータ行の行コレクションに行を追加できません](http://stackoverflow.com/questions/8708057/rows-cannot-be-programmatically-added-to- -dataagridviews-row-collection-when) – Jerrad

+1

投稿と同様に、データグリッド(dgdMembers)ではなく、データソース(dsDataSetE)に行を追加することになっています。 – Jerrad

+0

@Jerradしかし、私はどのように理解していません。 – ItsSimplyEddie

答えて

0

フォーム負荷でのDataGridViewにデータテーブルをロードし、(私たちはデータテーブルを使用することができる)データセットをバック渡し、Iクラスにデータをロードする例です。

ボタンクリックイベントでは、DataGridViewデータソースを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にデータを追加するための一つの方法です。クラス内のコードをフォームに配置することもできますが、フロントエンドコードからバックエンド操作を分離するのが最善です。

これが役に立ちます。

関連する問題