Jess31
asked on
DataGridView / get bound table name?
Using vb.net with DataGridView.
The DataGridView is bound to a table. How can I get the name of the bound data table from the DataGridView?
The DataGridView is bound to a table. How can I get the name of the bound data table from the DataGridView?
ASKER
Ryan,
first method returns ""
second one gives this error:
Unable to cast object of type 'System.Data.DataTable' to type 'System.Windows.Forms.Bind ingSource' .
first method returns ""
second one gives this error:
Unable to cast object of type 'System.Data.DataTable' to type 'System.Windows.Forms.Bind
MsgBox(CType(DataGridView1.DataSource, DataTable).TableName)
ASKER
returns ""
Complete solution for datagrid binded to bindingsource/dataset/data table (not supporting LINQ classes)
Private Function GetBoundTableName(dgv As DataGridView) As String
If dgv.DataSource Is Nothing Then Return ""
Dim dt As DataTable = Nothing
If TypeOf dgv.DataSource Is DataTable Then
dt = CType(dgv.DataSource, DataTable)
ElseIf TypeOf dgv.DataSource Is DataSet Then
dt = GetDsDataTable(CType(dgv.DataSource, DataSet), dgv.DataMember)
ElseIf TypeOf dgv.DataSource Is BindingSource Then
dt = GetBsDataTable(CType(dgv.DataSource, BindingSource))
End If
If dt Is Nothing Then Return ""
Return dt.TableName
End Function
'Get datatable binded to bindingsource
Private Function GetBsDataTable(ByVal bs As BindingSource) As DataTable
If TypeOf bs.DataSource Is DataTable Then Return CType(bs.DataSource, DataTable)
Return GetDsDataTable(GetBsDataSet(bs), bs.DataMember)
End Function
'Get dataset binded to bindingsource
Private Function GetBsDataSet(ByVal bs As BindingSource) As DataSet
If TypeOf bs.DataSource Is DataSet Then Return CType(bs.DataSource, DataSet)
If TypeOf bs.DataSource Is BindingSource Then Return GetBsDataSet(CType(bs.DataSource, BindingSource))
Return Nothing
End Function
'Get datatable in dataset (either as table or relation)
Private Function GetDsDataTable(ds As DataSet, tableName As String) As DataTable
If ds Is Nothing OrElse tableName = "" Then Return Nothing
If ds.Tables.Contains(tableName) Then Return ds.Tables(tableName)
If ds.Relations.Contains(tableName) Then Return ds.Relations(tableName).ChildTable
Return Nothing
End Function
ASKER
still getting ""
And I am binding a DataTable. Just like this DataGridView1.DataSource = dt
And I am binding a DataTable. Just like this DataGridView1.DataSource = dt
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
MsgBox(CType(DataGridView1.DataSource, DataTable).TableName)
that posted by Ark should get the name you wanted.make sure before you bind your DataTable to your DataGridView, you got set its TableName accordingly?
like:
Dim dt As New DataTable
dt.TableName = "test 123"
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Date", GetType(DateTime))
dt.Rows.Add(1, "John", DateTime.Now)
dt.Rows.Add(2, "Peter", DateTime.Now)
DataGridView1.DataSource = dt
Open in new window
OR
Open in new window