Avatar of Jess31
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?
* DataGridViewVisual Basic.NET

Avatar of undefined
Last Comment
Ryan Chong

8/22/2022 - Mon
Ryan Chong

you may try this;

YourDataGridView.DataMember

Open in new window


OR

Dim src As BindingSource = YourDataGridView.DataSource
        MessageBox.Show(src.DataMember)

Open in new window

Jess31

ASKER
Ryan,
first method returns ""

second one gives this error:
Unable to cast object of type 'System.Data.DataTable' to type 'System.Windows.Forms.BindingSource'.
Ark

MsgBox(CType(DataGridView1.DataSource, DataTable).TableName)

Open in new window

This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
rwheeler23
Jess31

ASKER
returns ""
Ark

Complete solution for datagrid binded to bindingsource/dataset/datatable (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

Open in new window

Jess31

ASKER
still getting ""
And I am binding a DataTable. Just like this DataGridView1.DataSource = dt
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
ASKER CERTIFIED SOLUTION
Ark

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Ryan Chong

MsgBox(CType(DataGridView1.DataSource, DataTable).TableName)

Open in new window

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