중첩 리피터 2탄..

Nested Repeater Episode2! =_=;;;;

전에 작성한 Repeater은 한꺼번에 바인딩을 해오는 경우였다..
그런데..
데이타가 워낙 많을 경우.. 여러모로 부담스럽다...
초창기 때  저런 식으로 작업하다가.. 화면 하나 뜨는데 엄청 오래 걸렸던 기억이 있다.

그래서.. 이번엔..
Parent Repeater에만 데이타를 불러오고..
버튼을 클릭하면.. 해당하는 Row에 관련된 데이타를 불러오게 할려고 한다.

private void GetData()
{
    using (SqlConnection con = DBHandler.ConnectionDatabase(WebDB.ERP_DB))
    {
        con.Open();

        SqlCommand cmd = DBHandler.ProcCmd(con, "dbo.usp_GetGoodsList");

        try
        {
            DataSet ds = DBHandler.ExecuteDataSet(cmd);
            if (ds != null)
            {
                rptParent.DataSource = ds;
                rptParent.DataBind();
            }
        }
        catch (Exception ex)
        {
            exMessage = ex.Message;
            PageUtil.StopNGoBack(this, ":: 오류 발생 ::\n[" + exMessage + "]\n잠시후에 다시 시도해 주십시오.");
        }
        finally
        {
            con.Close();
            con.Dispose();
        }
    }
}
위의 소스는 단순히 Parent Repeater에 바인딩 했을 뿐..

아래에는 단순 버튼.. 단지 CommanName만 주었다.
asp:Button id=btnView runat="server" Text="Button" CommandName="clickView">

버튼을 클릭했을 때.. CommandName이 clickView이면 rptNested에 DataBinding 한다.

아.. 쉽당.. =_=;;;;;

줸장.. ㅠㅠ 왜 이런 생각은 빨리 빨리 안 떠오른거얌.. ㅠㅠ
프로젝트 끝나니깐.. 생각이 나넹. .ㅠㅠ
protected void rptParent_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "clickView")
    {
        Repeater rptNested = e.Item.FindControl("rptNested") as Repeater;

        using (SqlConnection con = DBHandler.ConnectionDatabase(WebDB.ERP_DB))
        {
            con.Open();

            SqlCommand cmd = DBHandler.ProcCmd(con, "dbo.usp_GoodsListDetail");

            DataSet ds = DBHandler.ExecuteDataSet(cmd);

            rptNested.DataSource = ds;
            rptNested.DataBind();

            con.Close();
            con.Dispose();
        }
    }
}
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by jincaesar

2010/03/10 16:10 2010/03/10 16:10
, ,
Response
No Trackback , No Comment
RSS :
http://jincaesar.maru.net/tc/rss/response/18

중첩리피터..

작업하다보면 중첩리피터..(Nested Repeater)를 사용하게 되는 경우가 왕왕있다..
User ID:  

User Job <%# DataBinder.Eval(Container.DataItem, "UserJob") %>
User Name <%# DataBinder.Eval(Container.DataItem, "UserName")%>

aspx 페이지는 대충 만들고.. =_=;;;
06번째 줄.. OnItemDataBound를 입력하는건 잊지말고.. =_=;;
대충 안에.. rptNested를 하나 더 만들어 놓자..
#region #. Add Reference
using System.Data;
using System.Data.SqlClient;
using System.Transactions;
using Jincaesar.EnterpriseDatabase;
#endregion

namespace JinSolution.SampleCode
{
public partial class NestedRepeaterSample : System.Web.UI.Page
{
#region #. Variable
protected string exMessage = string.Empty;
#endregion

protected void Page_Load(object sender, EventArgs e)
{
    GetData();
}

private void GetData()
{
    using (TransactionScope tScope = new TransactionScope())
    {
        using (SqlConnection con = DBHandler.ConnectionDatabase())
        {
            con.Open();

            SqlCommand cmd = DBHandler.ProcCmd(con, "dbo.UserJob");

            DBHandler.AddWithValue(cmd, "UserID", txtUserID.Text.Trim());

            try
            {
                DataSet ds = DBHandler.ExecuteDataSet(cmd);
                if (ds != null)
                {
                    ds.Relations.Add(new DataRelation("_NestedData", ds.Tables[0].Columns["UserID"], ds.Tables[1].Columns["UserID"]));

                    rptMain.DataSource = ds;
                    rptMain.DataBind();
                }
            }
            catch (Exception ex)
            {
                exMessage = ex.Message;
                PageUtil.StopNGoBack(this, ":: 오류 발생 ::\n[" + exMessage + "]\n잠시후에 다시 시도해 주십시오.");
            }
            finally
            {
                con.Close();
                con.Dispose();
            }
        }
    }
}

protected void btnSearch_Click(object sender, EventArgs e)
{
    GetData();
}

protected void rptMain_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    DataRowView drv = e.Item.DataItem as DataRowView;

    if (drv != null)
    {
        Repeater rptNested = e.Item.FindControl("rptNested") as Repeater;

        if (rptNested != null)
        {
            rptNested.DataSource = drv.CreateChildView("_NestedData");
            rptNested.DataBind();
        }
    }
}

38번째 줄.. ds.Relations.Add로 Stored Procedure에서 2개의 테이블을 조회한걸.. 이어준다..

63번째 줄.. rptMain_ItemDataBound 이벤트에서..
65번째 줄.. e.Item.DataItem을 DataRowView에 담아두고..
69번째 줄.. FindControl로 rptNested를 찾아서..
DataBind() 해주면 끝..

의외로 간단하다..
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by jincaesar

2010/03/07 21:37 2010/03/07 21:37
,
Response
No Trackback , No Comment
RSS :
http://jincaesar.maru.net/tc/rss/response/16