如何将数据绑定网格视图强制转换为数据表?



我正在尝试向数据绑定的数据网格视图添加行

法典:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Dim Index As Integer
'Index = DataTable1DataGridView.CurrentCell.RowIndex
Dim dt As DataTable = DataTable1DataGridView.DataSource
Dim dr As DataRow = dt.NewRow
dt.Rows.Add(dr)
End Sub

错误:无法将类型为"System.Windows.Forms.BindingSource"的对象强制转换为类型"System.Data.DataTable"。

这里

Dim dt As DataTable = DataTable1DataGridView.DataSource

你有DataSource是对象,它指向System.Windows.Forms.BindingSource,而不是DataTable

您需要了解DataSourceBindingSource

dim ds as DataSet = 
DirectCast(DirectCast(DataTable1DataGridView.DataSource, BindingSource).DataSource, DataSet)

你做错了。您有BindingSource是有原因的,因此请使用它。您根本不需要访问DataTable。只需使用BindingSource,您应该可以直接引用,因此您也不需要网格。

Dim rowView = DirectCast(DataTable1BindingSource.AddNew(), DataRowView)
rowView("SomeColumn") = someValue
DataTable1BindingSource.EndEdit()

当你绑定一个DataTable时,数据实际上来自DefaultView属性,这是一个DataView。这就是为什么每个项目都是一个DataRowView而不是一个DataRow。在许多情况下,您可以像对待DataRow一样对待DataRowView,包括这种情况。但是,如果您有类型化的DataSet,则可能更喜欢使用类型化的DataRow。在这种情况下,请从DataRowViewRow属性中获取DataRow,并将其转换为适当的类型:

Dim rowView = DirectCast(DataTable1BindingSource.AddNew(), DataRowView)
Dim row = DirectCast(rowView.Row, DataTable1DataRow)
rowView.SomeColumn = someValue
DataTable1BindingSource.EndEdit()

最新更新