protected void Page_Load(object sender, EventArgs e)
{
var dtCompany = InitCompanyData();
var dtSubCompany = InitSubCompanyData();
// 데이터셋 생성
var ds = new DataSet();
ds.Tables.Add(dtCompany);
ds.Tables.Add(dtSubCompany);
// 관계 설정
// DB 조회시에는 SP에서 테이블을 여러개 읽어와 Fill로 DataSet을 만든 후 Relation만 잡아주면 된다.
ds.Relations.Add("CompanyKey", ds.Tables["CompanyTable"].Columns["Key"], ds.Tables["SubCompanyTable"].Columns["FKey"]);
// 부모 테이블 바인딩
CompanyList.DataSource = ds.Tables["CompanyTable"];
CompanyList.DataBind();
}
private DataTable InitCompanyData()
{
var dtCompany = new DataTable();
dtCompany.TableName = "CompanyTable";
dtCompany.Columns.Add("Key", typeof(string));
dtCompany.Columns.Add("Name", typeof(string));
var newRow = dtCompany.NewRow();
newRow["Key"] = "A";
newRow["Name"] = "A사";
dtCompany.Rows.Add(newRow);
newRow = dtCompany.NewRow();
newRow["Key"] = "B";
newRow["Name"] = "B사";
dtCompany.Rows.Add(newRow);
return dtCompany;
}
private DataTable InitSubCompanyData()
{
var dtSubCompany = new DataTable();
dtSubCompany.TableName = "SubCompanyTable";
dtSubCompany.Columns.Add("FKey", typeof(string));
dtSubCompany.Columns.Add("Name", typeof(string));
var newRow = dtSubCompany.NewRow();
newRow["FKey"] = "A";
newRow["Name"] = "A-1 계열사";
dtSubCompany.Rows.Add(newRow);
newRow = dtSubCompany.NewRow();
newRow["FKey"] = "B";
newRow["Name"] = "B-1 계열사";
dtSubCompany.Rows.Add(newRow);
newRow = dtSubCompany.NewRow();
newRow["FKey"] = "B";
newRow["Name"] = "B-2 계열사";
dtSubCompany.Rows.Add(newRow);
return dtSubCompany;
}
protected void CompanyList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater SubCompanyList = e.Item.FindControl("SubCompanyList") as Repeater;
// 관계가 설정된 자식 테이블 얻어오기
// 이 부분에서 한번 더 쿼리를 실행할 필요 없이, 관계가 맺어진 정보를 읽어올 수 있다.
var childRows = ((DataRowView)e.Item.DataItem).Row.GetChildRows("CompanyKey");
SubCompanyList.DataSource = childRows;
SubCompanyList.DataBind();
}
}