관리 메뉴

웹개발자의 기지개

사용자정의 컨트롤(User Control) 로 이벤트 활용하기 본문

ASP.NET

사용자정의 컨트롤(User Control) 로 이벤트 활용하기

http://portfolio.wonpaper.net 2018. 11. 18. 14:59

■ 보통 사용자정의 컨트롤은 헤더, 푸터 형식으로 단순 html 결합방식으로 이용했었는데,


마침 공부하다 재미있는 사항이 있어 한번 테스트 해봤다.


컨트롤은 컨트롤이다. ㅎㅎ 이벤트를 활용해 보자.



 ■ 작업할 파일 목록

LinkTableItem.cs   - LinkTableItem 클래스
LinkTable.ascx     - 이용하고자 하는 사용자정의 컨트롤
Default3.aspx       - 일반 웹페이지

 

■ LinkTableItem 클래스 



// text, url 값으로 사이트명, 링크값 내용 저장하고 있는 클래스

 public class LinkTableItem
{
    private string text;
    public string Text
    {
        get { return text; }
        set { text = value; }
    }

    private string url;
    public string Url
    {
        get { return url; }
        set { url = value; }
    }

    public LinkTableItem()   {  }

    public LinkTableItem(string text, string url)
    {
        this.text = text;
        this.url = url;
    }
}


 

■ LinkTable.ascx.cs 화일 


 

public partial class LinkTable : System.Web.UI.UserControl
{
    public string Title
    {
        get { return lblTitle.Text; }
        set { lblTitle.Text = value; }
    }

    private LinkTableItem[] items;
    public LinkTableItem[] Items
    {
        get { return items; }
        set
        {
            items = value;
            GridView1.DataSource = items;
            GridView1.DataBind();
        }
    }

 

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // LinkClicked 이벤트 선언
    public event LinkClickedEventHandler LinkClicked;

   // GridView1 의 Row 이벤트 처리 
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (LinkClicked != null)
        {
            LinkButton link = (LinkButton)e.CommandSource;

            LinkTableItem item = new LinkTableItem(link.Text, link.CommandArgument);
            LinkTableEventArgs args = new LinkTableEventArgs(item);

 

            // 이벤트 발생. 빵야~

            LinkClicked(this, args);

 

            // 해당 그 이벤트에 작동이 최소 된다면, 해당 페이지로 고고
            if (!args.Cancel) {
                Response.Redirect(item.Url);
            }
        }
    }

}

// 대리자 선언 지정

public delegate void LinkClickedEventHandler(object sender, LinkTableEventArgs e);


// 이벤트 매개변수 정보 클래스
public class LinkTableEventArgs : EventArgs
{
    private LinkTableItem selectedItem;
    public LinkTableItem SelectedItem
    {
        get { return selectedItem; }
    }

    private bool cancel = false;
    public bool Cancel
    {
        get { return cancel; }
        set { cancel = value; }
    }

    public LinkTableEventArgs(LinkTableItem item)
    {
        selectedItem = item;
    }
}


 

■ LinkTable.ascx 화일 


 

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="LinkTable.ascx.cs" Inherits="LinkTable" %>

 

<asp:Label ID="lblTitle" runat="server" Text="">타이틀 부분</asp:Label>

<table style="width: 61%; height: 167px;" border="1">
    <tr>
        <td>        
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
                CellPadding="4" ForeColor="Black" GridLines="Horizontal" Height="147px"
                ShowHeader="False" Width="302px" onrowcommand="GridView1_RowCommand">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                           
                            <asp:LinkButton ID="lnk" runat="server" CommandName="LinkClick" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"Url") %>' Text='<%# DataBinder.Eval(Container.DataItem,"Text") %>'></asp:LinkButton>
                           
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
                <FooterStyle BackColor="#CCCC99" ForeColor="Black" />
                <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
            </asp:GridView>
       
        </td>
    </tr>
    </table>



 

■ Default3.aspx.cs 


 

public partial class Default3 : System.Web.UI.Page
{

 

    protected void Page_Load(object sender, EventArgs e)
    {
        LinkTable1.Title = "링크 테이블의 타이틀 화면표시";

        LinkTableItem[] items = new LinkTableItem[3];
        items[0] = new LinkTableItem("Apress", "
http://www.apress.com");
        items[1] = new LinkTableItem("naver", "
http://www.naver.com");
        items[2] = new LinkTableItem("yahoo", "
http://www.yahoo.co.kr");

        LinkTable1.Items = items;

       

        // LinkClicked 이벤트를 LinkClickedEventHandler 에 연결

        LinkTable1.LinkClicked +=new LinkClickedEventHandler(OnLinkClicked);
    }
    // LinkClickedEventHandler 를 실제 처리하는 메소드
    protected void OnLinkClicked(object sender, LinkTableEventArgs e)
    {
        lblInfo.Text = "You clicked ' " + e.SelectedItem.Text

                                                 + " ' but this page chose not to direct you to ' " + e.SelectedItem.Url + " ' ";
        e.Cancel = true;
    }
}


 


■ Default3.aspx - 실제 웹페이지



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<%@ Register src="LinkTable.ascx" tagname="LinkTable" tagprefix="uc2" %>

 

    <form id="form1" runat="server">
    <div>
                
        <uc2:LinkTable ID="LinkTable1" runat="server" />
        <br />
           
        <asp:Label ID="lblInfo" runat="server" Text=""></asp:Label>
    </div>
    </form>


 


■ 실행화면

 


실행 화면은 너무나도 단순하지만 그 실제 사용자 정의 이벤트를 실제 만들고 연동 시켜 봤다는데에 큰 의미를 두고 싶다



Comments