2011. 7. 29. 16:08

DataList 컨트롤


Repeater컨트롤과 마찬가지로 데이터 소스로부터 데이터를 읽어 보여주는 컨트롤입니다
템블릿을 이용해서 하나의 데이터 요소를 보여줄 형식을 정의 합니다. 테이블에서 하나의 레코드가 하나의 템플릿과 연결 됩니다.


속성                                 설명
RepeatColumns                레이아웃에 사용되는 열의 개수를 지정합니다.
                                       예)DataList1.RepeatColumns = 3;
RepeatDirection                레이아웃에서 항목이 배치되는 방향입니다.
RepeatLayout                   항목을 반복할 때 테이블을 이용해서 반복할 것인지, 선형으로 반복할 것인지 지정합니다.
ShowFooter                     DataList 컨트롤의 바닥글을 표시할 것인지 지정합니다.
ShowHeader                    DataList 컨트롤의 머리글을 표시할 것인지 지정합니다.


템플릿의 종류

템플릿                                    설명
ItemTemplate                         데이터 항목을 보여줄 템플릿으로 반드시 정의되어야 합니다.
AltenatingItemTemplate            열을 보여줄 때 번강아 가면서 다른 형식으로 보여줄 때 사용합니다.
HeaderTemplate                     데이터 항목 리스트를 보여주기 전에 보여줄 내용입니다. 리스트의 머리에 위치하고 제목을
                                            보여줄수 있습니다.
SeparatioTemplate                  데이터 항목과 항목 사이에 보여줄 템플릿입니다.
SelecteditemTemplate              리스트에서 사용자가 어떤 데이터 항목을 선택했을때, 보여줄 선택 템플릿입니다.
EditltemTemplate                    편집 모드로 들어갔을때,보여줄 편집 템플릿입니다.
                                     



예제1.


DataList.aspx

        <asp:DataList ID="DataList1" runat="server"
            onitemcommand="DataList_ItemCommand">
            <ItemTemplate>
                <asp:LinkButton ID=LinkButton1 runat="server"
                Text='<%#Eval("title") %>'
                CommandName="Select" /><br />
            </ItemTemplate>
            <SelectedItemTemplate>
                제목:<%#Eval("title") %><br />
                저자:<%#Eval("author") %><br />
                설명:<%#Eval("desc") %><br />
            </SelectedItemTemplate>
        </asp:DataList>


       

DataList.aspx.cs

using System.Xml;

public partial class DataList : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        XmlDataDocument doc = new XmlDataDocument();
        doc.DataSet.ReadXml(Server.MapPath("books.xml"));

        DataList1.DataSource = doc.DataSet;
        DataList1.DataBind();
    }
    protected void DataList_ItemCommand(object source, DataListCommandEventArgs e)
    {
        //클릭한 데이터 항목의 인덱스 값을 SelectedIndex에 할당
        DataList1.SelectedIndex = e.Item.ItemIndex;
        DataList1.DataBind();
    }
}



 
예제2.

CartDataList.aspx


        <asp:DataList ID="DataList1" runat="server"
            oncancelcommand="DataList1_CancelCommand" oneditcommand="DataList1_EditCommand"
            onupdatecommand="DataList1_UpdateCommand">
            <ItemTemplate>
                <%#Eval("title") %> / <%# Eval("qty") %> / <%#Eval("price") %>
                <asp:LinkButton CommandName="Edit" Text="편집" runat="server" ID="Button1">
                </asp:LinkButton>
            </ItemTemplate>
           
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" text='<%#Eval("title") %>' runat="server" />
                <asp:TextBox ID="TextBox2" Text='<%#Eval("qty") %>' runat="server" />
                <asp:TextBox ID="TextBox3" Text='<%#Eval("price") %>' runat="server" />
                <asp:LinkButton CommandName="Update" Text = "확인" runat="server" ID = "Button2" />
                <asp:LinkButton CommandName="Cancal" Text = "취소" runat="server" ID = "Button3" />
            </EditItemTemplate>
        </asp:DataList>     



CartDataList.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class CartDataList : System.Web.UI.Page
{
    private DataTable Cart;
    private DataView CartView;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["Cart"] == null) //세션 변수가 비어 있는지 검사
            CrateCart();
        else
            Cart = (DataTable)Session["Cart"];

        //DataView 객체 생성, Cart 테이블 뷰 객체
        CartView = new DataView(Cart);
        CartView.Sort = "title";

        if (!IsPostBack)
        {
            DataList1.DataSource = CartView; //데이터 바인딩
            DataList1.DataBind();

        }
    }

    void CrateCart()
    {
        //cart 테이블 정의
        Cart = new DataTable();

        Cart.Columns.Add(new DataColumn("title", typeof(string)));
        Cart.Columns.Add(new DataColumn("qty", typeof(string)));
        Cart.Columns.Add(new DataColumn("price", typeof(string)));

        //생생한 Cart 테이블을 세션 변수에 할당합니다.
        Session["Cart"] = Cart;

        // Cart테이블 데이터 행 추가, 임의로 데이터를 만들어 추가 합니다.
        DataRow dr;

        for (int i = 1; i < 5; i++)
        {
            dr = Cart.NewRow();

            dr[0] = "클릭하세요, " + i.ToString();
            dr[1] = 10 * i;
            dr[2] = 10000 * i;

            Cart.Rows.Add(dr);
        }
    }
    protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
    {
        //편집할 데이터 항목 인덱스 할당
        DataList1.EditItemIndex = e.Item.ItemIndex;

        DataList1.DataSource = CartView;
        DataList1.DataBind();
    }
   
    protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e)
    {
        //현재 데이터 행 인덱스를 구합니다.
        int row = Convert.ToInt32(e.Item.ItemIndex);

        //편집 모드에 있는 각 TextBox 컨트롤을 구합니다.
        TextBox Text1 = (TextBox)e.Item.FindControl("TextBox1");
        TextBox Text2 = (TextBox)e.Item.FindControl("TextBox2");
        TextBox Text3 = (TextBox)e.Item.FindControl("TextBox3");

        //현재 데이터 행을 구해서 값을 넣어줍니다.
        DataRow dr = Cart.Rows[row];

        dr[0] = Text1.Text;
        dr[1] = Text2.Text;
        dr[2] = Text3.Text;

        //편집 모드에서 벗어납니다.
        DataList1.EditItemIndex = -1;

        //수정 데이터를 보여주기위해 다시 데이터 바인딩 합니다.
        DataList1.DataSource = CartView;
        DataList1.DataBind();
    }
    protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e)
    {
        //편집 모드에서 벗어납니다.
        DataList1.EditItemIndex = -1;

        //수정된 데이터를 보여주기 위해서 바인딩 한다.
        DataList1.DataSource = CartView;
        DataList1.DataBind();
    }
}