Public Function DataTableInnerJoin(ByVal Relation As DataRelation, Optional ByVal DataTableName As String = "", Optional ByVal SensitiveValuesOnly As Boolean = True) As DataTable Dim JoinedDataTable As New DataTable Dim ThisColumn, NewColumn As DataColumn Dim ThisRow, NewRow As DataRow Dim idx As Integer Dim ThisCell Dim CellsGroup As New Hashtable Dim ColumnName As String If DataTableName = "" Then JoinedDataTable.TableName = Relation.RelationName + "table" Else JoinedDataTable.TableName = DataTableName End If For Each ThisColumn In Relation.ChildTable.Columns If SensitiveValuesOnly Then If Not Me.isContainedInArray(ThisColumn, Relation.ChildColumns) Then NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName) JoinedDataTable.Columns.Add(NewColumn) End If Else NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName) JoinedDataTable.Columns.Add(NewColumn) End If Next For Each ThisColumn In Relation.ParentTable.Columns If SensitiveValuesOnly Then If Not Me.isContainedInArray(ThisColumn, Relation.ParentColumns) Then NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName) JoinedDataTable.Columns.Add(NewColumn) End If Else NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName) JoinedDataTable.Columns.Add(NewColumn) End If Next NewRow = JoinedDataTable.NewRow() For Each ThisRow In Relation.ChildTable.Rows CellsGroup.Clear() NewRow = JoinedDataTable.NewRow() For idx = 0 To ThisRow.ItemArray.GetUpperBound(0) ColumnName = Relation.RelationName + Relation.ChildTable.TableName + Relation.ChildTable.Columns(idx).ColumnName If JoinedDataTable.Columns.Contains(ColumnName) Then CellsGroup.Add(ColumnName, ThisRow.Item(idx)) NewRow(ColumnName) = ThisRow.Item(idx) End If Next JoinedDataTable.Rows.Add(NewRow) Next Dim PrimaryKeyColumns(Relation.ChildTable.PrimaryKey.Length) As DataColumn idx = 0 For Each ThisColumn In Relation.ChildTable.PrimaryKey PrimaryKeyColumns(idx) = JoinedDataTable.Columns.Item(Relation.RelationName + Relation.ChildTable.TableName + ThisColumn.ColumnName) idx = idx + 1 Next JoinedDataTable.PrimaryKey = PrimaryKeyColumns Dim externalkeys() As Object Dim Externalvalues As DataRow Dim SearchPoint As Int16 = Relation.RelationName.Length Dim EndSearch As Int16 = Relation.ChildTable.TableName.Length Dim PrimaryKeyValues(Relation.ChildTable.PrimaryKey.Length - 1), ForeignKeyValues(Relation.ParentTable.PrimaryKey.Length - 1) For Each ThisRow In JoinedDataTable.Rows idx = 0 For Each ThisColumn In JoinedDataTable.PrimaryKey PrimaryKeyValues(idx) = ThisRow.Item(ThisColumn) idx = idx + 1 Next Externalvalues = Relation.ChildTable.Rows.Find(PrimaryKeyValues) For idx = 0 To Relation.ChildColumns.GetUpperBound(0) ForeignKeyValues(idx) = Externalvalues.Item(Relation.ChildColumns(idx)) Next Externalvalues = Relation.ParentTable.Rows.Find(ForeignKeyValues) For Each ThisColumn In Relation.ParentTable.Columns ColumnName = Relation.RelationName + Relation.ParentTable.TableName + ThisColumn.ColumnName MessageBox.Show("preif") If JoinedDataTable.Columns.Contains(ColumnName) Then MessageBox.Show("ifgone") ThisRow(ColumnName) = Externalvalues.Item(ThisColumn) End If Next Next Return JoinedDataTable End Function