How to: Implement Master-Detail at Runtime (XPO)
- 4 minutes to read
This example shows how to create ASPxGridView controls at runtime to display master-detail data.
- Define Persistent Classes
- Connect to a Database Server
- Retrieve Data From the Database
- Create Detail ASPxGridView
- Create Master ASPxGridView
1. Define Persistent Classes
using DevExpress.Xpo;
public class Customer : XPObject {
public Customer(Session session) : base(session) { }
string fCustomerName;
public string CustomerName {
get { return fCustomerName; }
set { SetPropertyValue<string>("CustomerName", ref fCustomerName, value); }
}
[Association("Customer-Orders", typeof(Order)), Aggregated]
public XPCollection Orders { get { return GetCollection("Orders"); } }
}
public class Order : XPObject {
public Order(Session session) : base(session) { }
string fProductName;
public string ProductName {
get { return fProductName; }
set { SetPropertyValue<string>("ProductName", ref fProductName, value); }
}
DateTime fOrderDate;
public DateTime OrderDate {
get { return fOrderDate; }
set { SetPropertyValue<DateTime>("OrderDate", ref fOrderDate, value); }
}
[Association("Customer-Orders")]
public Customer Customer;
}
Note
See the following topic for detailed information on how to create XPObjects: Relationships Between Objects.
2. Connect to a Database Server
Create an IDataLayer object to connect XPO to a database server. The code that creates the data layer must be placed inside the Application_Start event handler in the Global.asax module of your website. See the following topic for more information: Connecting XPO to a Database Server (ASP.NET).
void Application_Start(object sender, EventArgs e) {
string conn = DevExpress.Xpo.DB.AccessConnectionProvider.GetConnectionString(
Server.MapPath("~\\App_Data\\Customer.mdb"));
DevExpress.Xpo.Metadata.XPDictionary dict = new DevExpress.Xpo.Metadata.ReflectionDictionary();
// Initialize the XPO dictionary.
dict.GetDataStoreSchema(typeof(Customer).Assembly);
DevExpress.Xpo.XpoDefault.Session = null;
DevExpress.Xpo.DB.IDataStore store = DevExpress.Xpo.XpoDefault.GetConnectionProvider(conn,
DevExpress.Xpo.DB.AutoCreateOption.SchemaAlreadyExists);
DevExpress.Xpo.XpoDefault.DataLayer = new DevExpress.Xpo.ThreadSafeDataLayer(dict, store);
}
Note
See the following topic for details on how to connect to a database server: Connecting XPO to a Database Server (ASP.NET).
3. Retrieve Data From the Database
Use the XpoDataSource components to retrieve data from the database.
Master: Customers
Set its TypeName property to Customer.
Detail: Orders
Set its TypeName to Order.
Use the Criteria property to specify the filter condition. Set this property to ‘[Customer.Oid] = ?’.
Invoke the Parameter Collection Editor, and add a criteria parameter. This parameter gets its value at runtime from the “Oid” Session field.
Handle the page’s Init event to bind XpoDataSource components to a database.
4. Create Detail ASPxGridView
public class DetailRowTemplate : ITemplate {
object dataSource = null;
public DetailRowTemplate(object dataSource) {
this.dataSource = dataSource;
}
public void InstantiateIn(Control container) {
ASPxGridView detailGridView = new ASPxGridView();
detailGridView.SettingsDetail.IsDetailGrid = true;
detailGridView.DataSource = dataSource;
detailGridView.KeyFieldName = "Oid";
detailGridView.BeforePerformDataSelect
+= new EventHandler(detailGridView_BeforePerformDataSelect);
container.Controls.Add(detailGridView);
}
void detailGridView_BeforePerformDataSelect(object sender, EventArgs e) {
HttpContext.Current.Session["Oid"] = (sender as ASPxGridView).GetMasterRowKeyValue();
}
}
5. Create Master ASPxGridView
protected void Page_Load(object sender, EventArgs e) {
ASPxGridView gv = new ASPxGridView();
gv.DataSource = dsCustomers;
gv.SettingsDetail.ShowDetailRow = true;
gv.SettingsDetail.ShowDetailButtons = true;
gv.Templates.DetailRow = new DetailRowTemplate(dsOrders);
gv.KeyFieldName = "Oid";
ASPxRoundPanel1.Controls.Add(gv);
gv.DataBind();
}