In this example we will focus on this set of data of a company represented by the next diagram
We will display related data between Employees and Projects in two different grids, synchronizing both of them
To achieve this we will create a view with the data corresponding to the Projects of the Employee, and two stored procs, one for retrieve data from our Employees table, and the other one from our Projects view
CREATE VIEW VIEW_PROJECTS AS SELECT E.IdEmployee, P.Name AS Project, P.Description, EP.AssignmentDate, P.DueDate, C.Name AS Customer FROM C_EMPLOYEES E JOIN C_EMPLOYEES_PROJECTS EP ON E.IdEmployee = EP.IdEmployee JOIN C_PROJECTS P ON EP.IdProject = P.IdProject JOIN C_CUSTOMERS C ON P.IdCustomer = C.IdCustomer GO CREATE PROCEDURE SELECT_EMPLOYEES AS BEGIN SELECT * FROM C_EMPLOYEES ORDER BY FirstName ASC, LastName ASC END GO CREATE PROCEDURE SELECT_PROJECT_DATA AS BEGIN SELECT * FROM VIEW_PROJECTS END GO
Now we will generate the XSD (XML Schema Definition) of our DataSet
The process includes setting up the connection, and adding two TableAdapters from the Toolbox
We include our database objects
And now we add the first TableAdapter, for Employees
We do the same process for adding the View of Projects, choosing the stored procedure SELECT_PROJECT_DATA
The last step is set up the Relation between tables
And this is the schema once complete
The XML Definition of the Relation in our Schema is the next
<xs:annotation> <xs:appinfo> <msdata:Relationship name="EMPLOYEES_PROJECTS_Relation" msdata:parent="SELECT_EMPLOYEES" msdata:child="SELECT_PROJECT_DATA" msdata:parentkey="IdEmployee" msdata:childkey="IdEmployee" msprop:Generator_UserChildTable="SELECT_PROJECT_DATA" msprop:Generator_ChildPropName="GetSELECT_PROJECT_DATARows" msprop:Generator_ParentPropName="SELECT_EMPLOYEESRow" msprop:Generator_UserRelationName="EMPLOYEES_PROJECTS_Relation" msprop:Generator_RelationVarName="relationEMPLOYEES_PROJECTS_Relation" msprop:Generator_UserParentTable="SELECT_EMPLOYEES" /> </xs:appinfo> </xs:annotation>
Finally, in our code, we will program the next method to initialize the grids
private void InitializeDataSet() { try { DataSetCompany dsCompany = new DataSetCompany(); SELECT_EMPLOYEESTableAdapter daEmployees = new SELECT_EMPLOYEESTableAdapter(); daEmployees.Fill(dsCompany.SELECT_EMPLOYEES); SELECT_PROJECT_DATATableAdapter daProjects = new SELECT_PROJECT_DATATableAdapter(); daProjects.Fill(dsCompany.SELECT_PROJECT_DATA); gridEmployees.DataSource = dsCompany; gridEmployees.DataMember = "SELECT_EMPLOYEES"; gridProjects.DataSource = dsCompany; gridProjects.DataMember = "SELECT_EMPLOYEES.EMPLOYEES_PROJECTS_Relation"; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
The result is as follows
<METHOD SOFTWARE © 2012>