천객만래 [千客萬來] (It has an interminable succession of visitors)

출처: http://www.taeyo.pe.kr/lecture/NET/UcTemplate.asp

강좌 최초 작성일 : 2006년 11월 14일
   강좌 최종 수정일 : 2006년 11월 15일

   강좌 읽음 수 : 4359 회

   작성자 : Taeyo(김 태영)
   편집자 : Taeyo(김 태영)

   강좌 제목 : UserControl 템플릿을 이용한 공통 UI 렌더링 

강좌 전 태오의 잡담>

이제 2006년의 크리스마스도 한달 정도밖에 남지 않았네요.
여러분들은 크리스마스에 무엇을 하실 생각이신가요?
무엇을 계획하던 한 해를 잘 정리하면서~ 즐겁게 보내시기 바랍니다.


공통적으로 자주 사용하는 UI 영역을 필요로 할 경우 여러분은 주로 어떻게 작업을 해 오셨나요? 대부분의 경우는 그 영역을 User Control이나 Custom Control로 제작해서 사용해 오셨을 것입니다. "나는 둘 다 아니었다!!"라고 자신하시는 분은 좋았어!! 패스!! -_-+

대개의 경우는 User Control을 이용했을텐데요. 이는 User Control의 개발이 상당히 쉽기 때문일 것입니다. Custom Control의 경우는 개발에 적지 않은 내공과 시간이 요구되기에 쉽사리 덤벼들 수 없지만, User Control은 기존에 존재하는 컨트롤들을 복합적으로 묶어서 쉽게 출력 영역을 꾸밀 수 있으니까요.

이번 강좌에서 하고자 하는 이야기는 바로 이러한 User Control을 사용함에 있어서, UI 개발자들이 좀 더 손쉽게 이를 다룰 수 있게, 그리고 이를 일종의 템플릿처럼 이용할 수 있게 하는 작은 기반을 만드는 방법에 대한 것입니다. 반드시 필요한 작업은 아닐 수 있지만, 일단 작성해두면 전반적인 개발이 편리해진다고나 할까요? 개발 생산성 및 유지 보수성이 좋아지는 방안이라고 보시면 될 듯 합니다.

제가 업무 프로젝트에서 하는 역할이 주로 아키텍처를 잡는다거나, 공통 모듈을 설계 및 가이드 한다거나, 개발자들의 개발 생산성을 높이기 위한 프레임워크 작업을 한다거나 하는 작업이다보니 이러한 쪽에 대한 관심이 본의 아니게 생길 수 밖에 없더군요(실은, 업체의 개발표준팀에서 그런 것들을 요구해 오거든요. 이런 게 있으면 편할 것 같은데 만들어 주세요. 이것 좀 자동화할 수 있는 도구가 있었으면 좋겠어요. 등등 -_-+).

아! 그러니깐, 정확히 이번 강좌가 어떤 내용을 다루는지 감이 잘 오지 않으신다구요? 그렇다면, 좀 더 구체적으로 말씀을 드려야 할 듯 하네요. 이번 강좌의 주 내용은 화면에 공통적으로 사용되는 출력 영력을 User Control로 만들고 이를 동적으로 손쉽게 페이지에 끼워넣을 수 있게 하려 합니다.

"설마, Page.LoadControl() 메서드를 이용해서 페이지에 동적으로 User Control을 넣자는 이야기를 하려는 것은 아니겠죠?" 라고 하시는 분들이 계시는데요. 다행히도 그 이야기는 아닙니다(엄밀히 말하면, 일부는 맞기도 합니다만 -_-). Page.LoadControl() 메서드를 이용해서 페이지에 동적으로 User Control을 추가하는 것은 User Control의 출력 데이터가 정적인 경우에 한해 부합할 것입니다. 만일, User Control이 Repeater나 DataList 등의 컨트롤로 구성되어 있고(예를 들면, 공지사항 목록 같은), 데이터 바인딩이 된 상태로 Page에 추가되어야 한다면 어떻게 할까요?

"뭡니까? 장난하십니까? 그럼 User Control안에서(예를 들면, Control의 Page_Load 이벤트) 데이터 바인딩 작업을 하면 되잖아요"라고 이야기하시는 분들 계십니다. 핫!!! 맞는 말씀입니다. 그런 방법이 있었군요. 음… 그렇네요.. 흠… 그렇구나…

그렇습니다. 일반적으로는 그렇게들 작업을 하셨을 것입니다. 물론, 공지사항 목록의 출력 같은 경우는 공통적으로 여기 저기에서 자주 사용되기에 분명 User Control(혹은 별도의 컨트롤)로 만들어서 사용하는 것이 이로울 것입니다. 그리고, 그 경우 대부분 데이터 액세스 하는 코드가 .ascx 파일 안에 담기게 되곤 하죠. N-Tier 작업을 많이 해보신 분들이라면 Business Logic 레이어와 Presentation 레이어를 명확하게 구분하여 작업을 하셨을 것입니다. 그렇기에 물론, 이와 같은 경우라 해도, ascx 파일 안에 데이터를 직접적으로 액세스 하는 코드는 작성하지 않을 것입니다. 다만, 비즈니스 로직 컴포넌트(BLC)나 데이터 액세스 컴포넌트(DAC)를 호출하여 얻어온 결과를 바인딩 하는 코드 정도만이 놓여져 있겠죠? 요는 어쨌든 그러한 코드가 있기는 있어야만 한다는 것입니다. 그렇기에, 그 User Control은 오로지 공지사항을 출력하기 위한 "공지사항 용 User Control"이란 이름을 갖게 될 것입니다. 왜냐하면, 그러한 목적으로 User Control을 꾸민 것이니까요.

하지만, User Control을 작성하다 보면, 출력하는 데이터만 다를 뿐이지, 그 출력 유형이 매우 유사한 경우를 많이 접하게 됩니다. 바로 여기서 한 가지 아이디어가 뾰료롱 생겨납니다. User Control을 템플릿처럼 사용할 수는 없을까? 즉, 공지사항 데이터던 주소 목록 데이터던 데이터를 던져주면 목록을 출력하는 User Control을 만들어두면 개발 생산성이 더 나아지지 않을까? 하는 생각이 들 수 있다는 것이죠. 바로 그것이 이번 강좌에서 이야기하고자 하는 내용입니다.

전용 User Control(공지사항용 컨트롤, 공통 데이터 출력용 컨트롤 등 특정 데이터를 출력하기 위해 작성한 컨트롤)을 작성하는 것이 나쁘다는 이야기는 아닙니다. 그는 매우 일반적인 방법이니까요. 다만, 상황에 따라서는 이를 좀 더 생산성이 높은 방향으로 바꿔보는 것도 나쁘지 않다는 생각입니다(생산성은 좋아지는 반면, 성능적으로는 약간의 희생이 따를 수 있습니다). 즉, 별도의 컨트롤러 클래스가 있어서 그가 동적으로 User Control에 데이터를 채우고 바인딩을 하도록 하자는 것이죠. 이런 식으로 구성하게 되면, ascx는 단지 출력을 위한 코드만을 담게되어 매우 간결해지며, ascx를 일종의 화면 템플릿 격으로 사용할 수 있게 됩니다.

예를 들면, 다음은 제가 작성해 본 공지사항 User Control(View.ascx)의 소스 코드 전체입니다.

View.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="View.ascx.cs" Inherits="Template_View" %>
<asp:DataList ID="DataList1" runat="server">
    <ItemTemplate>
        <%# Eval("title") %>
    </ItemTemplate>
</asp:DataList>

View.ascx.cs

public partial class Template_View : System.Web.UI.UserControl
{
    private object _data;
    public object Data
    {
        get { return _data; }
        set { _data = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        DataList1.DataSource = Data;
        DataList1.DataBind();
    }
}

보시다시피, User Control에는 데이터 바인딩 코드 외에는 아무것도 존재하지 않습니다. 바인딩을 위한 데이터를 가져오는 코드도 존재하지 않습니다. 이는 외부 컨트롤러 클래스가 동적으로 데이터를 밀어넣도록 할 것이기 때문입니다.

이 방식의 장점은 화면 개발자가 User Control의 HTML 구역에만 집중해서 작업을 할 수 있다는 것입니다. 내부적으로 데이터가 어떻게 바인딩되는지 어쩌는지 전혀 관심을 갖지 않아도 됩니다. 화면의 디자인만을 생각하면 되기에 이 User Control을 일종의 템플릿처럼 이를 사용할 수 있다는 것이죠. 주어지는 데이터가 어떤 것이냐에 따라 공지사항을 출력할 수도 있고, 다른 목록 데이터들을 출력할 수도 있습니다.

결과적으로, 이는 동일한 결과를 얻기 위한 또 다른 방식(개발 생산성을 높이는 방식)입니다. 하지만, 그렇다고 이 방식이 꼭 옳다고 말할 수는 없습니다. 제가 진행하는 프로젝트에서는 이를 이용하여 개발성 향상과 유지 보수성의 향상이 있었습니다만, 여러분의 상황에서는 오히려 번잡스럽고 어렵게 느껴질 수도 있습니다. 그러니, 끝까지 잘 살펴보시고 판단하시기 바랍니다. 그러나, 이를 여러분의 업무에 적용하지는 않는다 하더라도, 컨셉 정도는 느껴보시기를 권해 봅니다.

사실, 이 컨셉은 ASP.NET의 대부인 Scott Guthrie의 블로그에 올라온 "Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios"란 글에서 힌트를 얻어 작성한 것입니다. 해서, 사실 이 컨셉은 Ajax 애플리케이션을 제작할 경우에 더 적절하다고 보여집니다.

 http://weblogs.asp.net/scottgu/archive/2006/10/22/Tip_2F00_Trick_3A00_-Cool-UI-Templating-Technique-to-use-with-ASP.NET-AJAX-for-non_2D00_UpdatePanel-scenarios.aspx

자. 그렇다면, 전체적인 구현 설계를 살펴보고, 실제 구현을 한번 해보도록 하겠습니다.



TitlesManager란 클래스는 pubs 데이터베이스의 titles 테이블에서 책 데이터(DataTable)를 가져오는 역할을 수행하며, ViewManager를 이용하여 얻어온 데이터를 User Control에 바인딩한 뒤, 이를 반환하는 메서드를 제공하는 클래스입니다. 설명만으로는 이해가 어려울 수 있지만, 잠시 뒤에 소스 코드를 보시면 이해가 되실 것입니다. 사실, TitlesManager 클래스를 별도로 제작할 필요는 없습니다만(그냥 aspx 페이지에 코드를 넣어도 동작하는 데에는 문제가 없으니), 논리적으로 역할 구분을 하는 것이 설계적으로 좋아보이기에 별도의 클래스로 작성해 보았습니다.

ViewManager의 역할은 이 컨셉에서 매우 중요하지만, 그 내용은 의외로 간단합니다. 특정 ascx 컨트롤의 속성에 동적으로 데이터(TitlesManager가 넘겨주는 책 목록 데이터-DataTable)를 추가한 뒤, 그를 바인딩한 User Control을 반환하는 역할을 제공하는 것입니다. 기본 예제에서는 동적으로 User Control에 데이터를 건네주기 위해서 리플렉션 기술을 이용하고 있지만, 이는 차후 인터페이스를 이용하는 방식으로 바꾸어 성능적인 향상을 꾀할 수도 있을 것입니다.

어렵다구요? 말로만 설명하면 복잡한 감이 없지 않으니 직접 소스를 보면서 이해해 보도록 하시죠. 우선 TitlesManager.cs 클래스부터 살펴보도록 하겠습니다.

TitlesManager.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// TitlesManager의 요약 설명입니다.
/// </summary>
public class TitlesManager
{
    private DataTable GetTitles()
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = "server=(local);database=pubs;uid=**;pwd=**";
        string sql = "Select title from Titles";
        SqlCommand cmd = new SqlCommand(sql, con);
        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();

        adapter.Fill(ds);
        return ds.Tables[0];
    }

    public UserControl GetTitlesRenderControl()
    {
        DataTable titles = this.GetTitles();

        if (titles.Rows.Count > 0)
            return ViewManager.GetViewControl("~/Template/View.ascx", titles);
        else
            return ViewManager.GetViewControl("~/Template/NoView.ascx", null);
    }
}

TitlesManager 클래스는 우선 GetTitles()라는 메서드를 가지고 있습니다. 이는 데이터베이스로부터 책 목록 데이터를 가져와서 그를 DataTable 형식으로 반환하는 메서드입니다. n-Tier 구조로 설계되었다면, 사실상 이 메서드는 TitlesManager 클래스가 아닌 Data Access Component 쪽에 놓여져야 하겠습니다만, 여기서는 데모의 목적으로 코드를 여기에 직접 작성해 보았습니다. 만일, 여러분의 프로젝트에 개발 프레임워크가 도입되어 있고, 이미 Business Logic 계층과 Data Access 계층이 존재한다면 이 메서드는 그 안쪽에 작성되어야 할 것입니다.

TitlesManager 클래스의 핵심 메서드는 사실 GetTitlesRenderControl() 입니다. 이 메서드가 바로 ViewManager 클래스를 사용해서! 동적으로 필요한 User Control을 얻어내는 메서드이니까요. 해서, 소스를 보시면 이는 우선 GetTitles() 메서드를 이용해서 필요한 DataTable을 얻어내고 있으며, 그 가져온 데이터가 존재한다면(한 개 이상의 Row를 가진다면) View.ascx란 템플릿을, 데이터가 존재하지 않는다면 NoView.ascx란 템플릿을 동적으로 얻어와 반환하는 것을 볼 수 있습니다(View.ascx란 템플릿을 사용하는 경우에는 바인딩 데이터를 필요로 하므로, DataTable 개체를 인자로 넘겨주어야 합니다).

대략적인 TitlesManager 클래스의 역할이 이해가 되시나요? 그렇습니다. 별 것 없습니다. 쿼리 결과 데이터가 존재하면 View.ascx를, 데이터가 없으면 NoView.ascx를 얻어오는 ViewManager 클래스의 GetViewControl 메서드를 호출하는 것이 전부이니까요.

그렇기에, 여기서 중요한 것은 무엇보다도 ViewManager.GetViewControl() 라는 것을 여러분은 번쩍! 눈치 채셨을 것입니다. 실제로 ascx 템플릿과 주어진 데이터를 이용해 동적으로 User Control을 생성하는 핵심 역할을 하는 친구가 바로 ViewManager.GetViewControl()이니까요. 그렇다면, 이제 ViewManager 클래스의 코드를 한번 살펴보도록 하겠습니다.

ViewManager.cs

using System;
using System.Web;
using System.Web.UI;
using System.IO;
using System.Reflection;

public class ViewManager
{
    public static UserControl GetViewControl(string path, object data)
    {
        Page page = new Page();
        UserControl viewControl = (UserControl) page.LoadControl(path);

        if (data != null)
        {
            Type viewControlType = viewControl.GetType();
            PropertyInfo prop = viewControlType.GetProperty("Data");

            if (prop != null)
            {
                prop.SetValue(viewControl, data, null);
            }
            else
            {
                throw new Exception(path + "는 Data 속성을 가지고 있지 않습니다");
            }
        }

        return viewControl;
    }
}

ViewManager 클래스의 핵심은 GetViewControl라는 메서드입니다. 이는 주어진 ascx 파일명과 바인딩 데이터를 인자로 받아서 그를 이용해 동적으로 User Control을 생성하는 역할을 합니다. 해서, 처음 두 줄의 코드는 일단 지정된 경로의 ascx 파일을 User Control로 얻어내는 작업을 수행하고 있어요.

Page page = new Page();
UserControl viewControl = (UserControl) page.LoadControl(path);

만일, 이렇게 얻어온 User Control이 정적인 데이터만을 가진다면, 현재의 viewControl 개체를 그대로 반환해도 무관하겠지만, 고작 그런 작업을 하려했다면 굳이 이렇게 복잡하게 ViewManager를 제작할 필요조차 없었을 겁니다. ViewManager가 필요한 이유는 바로 동적으로 User Control의 속성을 설정할 필요가 있기 때문이니까요.

코드는 page.LoadControl() 메서드를 이용해서 UserControl 개체를 얻어오긴 했으나, 문제는 이 상태로는 해당 UserControl이 Data 라는 속성을 갖는지 어떤지 알 수가 없다는 것입니다. UserControl 형식의 .NET 클래스는 Data라는 필드를 기본적으로 가지고 있지 않으니까요.

하지만, 우리가 동적으로 로드하고자 하는 View.ascx 는 분명 Data라는 공개 속성을 가지고 있습니다. 그렇다면, 어떻게 프로그래밍적으로 이 개체의 Data 필드를 접근할 수 있을까요?

우리가 위에서 작성해놓은(위에서 소스를 보여드렸었죠?) View.ascx의 소스를 다시금 살펴보면 그는 Data라는 object 형식의 속성을 가지고 있음을 알 수 있습니다. 그리고, 컨트롤의 Page_Load 이벤트 시에는 그 Data를 가지고 데이터 바인딩을 시도함을 알 수 있죠. 이는 우리끼리 사전 정의해 놓은 규칙입니다. 즉,

"모든 ascx 템플릿들은 Data라는 공개 속성을 가지며, 데이터 바인딩은 그 데이터를 가지고 이루어진다"

가 우리끼리 약속해놓은 규칙이라는 것이죠. 다시 말해서, 우리가 템플릿으로 이용할 모든 ascx들은 Data라는 공개 속성을 가져야만 합니다. 현실적으로 이야기하자면, 이 규칙은 프로젝트의 클래스 설계 표준문서에 기록되어 있어야 할 것이고, 개발자들에게 사전에 숙지시켜야만 하는 부분이어야 할 것입니다.

그렇습니다. 방법은 크게 두 가지가 있습니다. 하나는 Data라는 속성을 갖는 인터페이스를 작성해서 View.ascx 클래스가 그 인터페이스(예를 들면, IcommonUC란 이름으로)를 구현하도록 하고, 다음과 같이 코드를 작성하는 방법이 있겠죠?

Page page = new Page();
ICommonUC viewControl = (ICommonUC)page.LoadControl(path);

사실, 이 방법이 제가 강좌에서 설명하려는 리플렉션 방법보다 훨씬 더 효과적인 방법임에는 틀림이 없습니다. 인터페이스를 사용한다면 위의 GetViewControl() 메서드도 다음과 같이 매우!! 간단해질 수 있을테니까요.

public static UserControl GetViewControlwInterface(string path, object data)
{
    Page page = new Page();
    UserControl ctl = (UserControl)page.LoadControl(path);
    ICommonUC viewControl = ctl as ICommonUC;

    if(viewControl != null)
        viewControl.Data = data;

    return ctl;
}
// 요 부분 코드는 유 경상 수석이 간섭했다는 후문이 돌고 있습니다.

사실, 결과론적으로는 상기와 같이 인터페이스를 사용하는 것을 강력히 추천합니다. 하지만, 이 강좌는 리플렉션을 이용해서 속성을 설정하는 내용을 보여드리고 있습니다. 다시 보여드리자면,

Type viewControlType = viewControl.GetType();
PropertyInfo prop = viewControlType.GetProperty("Data");

if (prop != null)
{
    prop.SetValue(viewControl, data, null);
}

가 바로 그러한 코드이죠. 리플렉션을 이용해서 현재 개체 형식이 Data라는 속성을 갖는지 여부를 검사하고, 만일 해당 속성이 존재한다면 그 속성에 데이터(우리의 경우 책 목록 DataTable)을 밀어넣는 것입니다.

리플렉션을 이용하는 방식은 성능적으로 그다지 좋지 않기에 크게 권장하지는 않습니다만, 제가 참고한 원래의 포스트 글이 이 방식을 사용했기에 저도 이 방식으로 글을 작성했습니다. 개인적으로는 리플렉션보다는 인터페이스를 사용하는 쪽을 권장하고 싶습니다. ^^;

자. 이제 TitlesManager와 ViewManager가 모두 완성되었네요. ViewManager는 다른 곳에서도 두고두고 재사용이 가능한 독립적인 모듈입니다. 만일, 여러분이 책 목록이 아닌 고객 데이터 목록을 다루고 싶다면, CustomerManager와 같은 클래스를 만들고 (코드는 TitlesManager와 유사하겠죠?) 내부적으로 ViewManager를 사용하시면 될 것입니다. ^^

자. 그럼 이제 이를 이용하는 ASPX 페이지를 만들어봐야 겠죠? 저는 default.aspx 페이지에 Label 컨트롤을 하나 올려놓고(굳이 Label일 이유는 없지만), 코드 비하인드에는 다음과 같이 코드를 작성해 보았습니다.

default.aspx.cs

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        UserControl ctl = (new TitlesManager()).GetTitlesRenderControl();
        lblData.Controls.Add(ctl);
    }
}

간단하죠? 다음은 전체 소스가 동작하여 나온 결과화면입니다.(저는 약간의 디자인을 입혀봤습니다. 그래봐야 큰 차이는 없지만 -_-)



나름대로 멋지지 않나요? ㅎㅎ

이것이 이번 강좌에서 전하고 싶었던 내용입니다. 사실, 제대로 이해하려면 전체 소스를 한번 돌려보고 디버깅 잡고, 소스를 따라가면서 확인하는게 더 좋긴 하죠. 해서, 강좌 하단에서는 전체 소스를 다운로드 할 수 있도록 준비해 두었습니다. 전체적으로 돌아가는 방식을 확인하시고 나면 이 방식이 맘에 드시는 분들도 조금 있지 않을까 생각해 봅니다.

그리고, 추가적으로 ViewManager 클래스를 보면 User Control을 직접적으로 반환하지 않고, 그 User Control의 내용을 HTML 문자열로 렌더하여 반환하는 메서드도 들어있는 것을 보실 수 있을 것입니다. ASP.NET 애플리케이션에서는 이 메서드가 그다지 유용하지 않을 수 있지만, AJAX 애플리케이션을 개발한다면 나름대로 쓸만하다고 할 수 있습니다. 그 메서드를 웹 서비스의 메서드로 빼 놓으면, 클라이언트 측에서 손쉽게 목록 데이트 출력을 얻어와 화면에 반영할 수 있을테니까요 ^^;

그리 어려운 내용은 아닌데, 제가 설명을 간결하게 하지 못해서 오히려 여러분을 어렵게 만든 것은 아닌지 걱정됩니다. 하지만, 맘에는 드셨죠?



UcTemplate.zip





Posted by SB패밀리

Creating GridView Columns Dynamically (Part 1)





http://www.dotnetbips.com/articles/56fadcb9-ee8b-4170-a6ad-cd4f38222bcb.aspx

Creating GridView Columns Dynamically (Part 1)

Introduction

Many months back I wrote three articles - Creating DataGrid ProgrammaticallyCreating DataGrid Templated Columns Dynamically - Part I and Creating DataGrid Templated Columns Dynamically - Part II. Even today these are amongst top viewed articles. This indicates how commonly developers need to create grid controls dynamically. Beginning with this article I am starting a series that will show you how to create data bound controls such as GridView and DetailsView programmatically. To begin with Part 1 shows how to add bound fields and command fields to a GridView. The GridView thus created is fully functional with paging, sorting and editing features.

Creating a sample web site

To begin with create new web site in Visual Studio. Drag and drop a GridView control and an SqlDataSource control on the default web form. Do not set any property of either controls at design time. We will be doing that via code.

Now key in the following code in the Page_Load event handler.

protected void Page_Load(object sender, EventArgs e)
{
SqlDataSource1.ConnectionString = 
@"data source=.;initial catalog=northwind;integrated security=true";
SqlDataSource1.SelectCommand = 
"select employeeID,FirstName,LastName from employees";
SqlDataSource1.UpdateCommand = 
"update employees set firstname=@FirstName,lastname=@LastName 
where employeeid=@EmployeeID";
SqlDataSource1.UpdateParameters.Add("@FirstName", "");
SqlDataSource1.UpdateParameters.Add("@LastName", "");
SqlDataSource1.UpdateParameters.Add("@EmployeeID", "");

if (!IsPostBack)
{
GridView1.DataSourceID = "SqlDataSource1";
GridView1.AutoGenerateColumns = false;
GridView1.DataKeyNames = new string[] { "EmployeeID" };
GridView1.AllowPaging = true;
GridView1.AllowSorting = true;
GridView1.PageSize = 5;

BoundField bf1 = new BoundField();
BoundField bf2 = new BoundField();
BoundField bf3 = new BoundField();

bf1.HeaderText = "Employee ID";
bf1.DataField = "EmployeeID";
bf1.ReadOnly = true;
bf1.SortExpression = "EmployeeID";

bf2.HeaderText = "First Name";
bf2.DataField = "FirstName";
bf2.SortExpression = "FirstName";

bf3.HeaderText = "Last Name";
bf3.DataField = "LastName";
bf3.SortExpression = "LastName";

CommandField cf = new CommandField();
cf.ButtonType = ButtonType.Button;
cf.ShowCancelButton = true;
cf.ShowEditButton = true;

GridView1.Columns.Add(bf1);
GridView1.Columns.Add(bf2);
GridView1.Columns.Add(bf3);
GridView1.Columns.Add(cf);
}
}

The code is dissected in the following sections

Configuring the SQL data source control

The code sets the ConnectionString property SQL data source control to required database connection string. In our example we will be using Employees table of Northwind database. Then SelectCommand and UpdateCommand properties are set to corresponding SELECT and UPDATE queries. The UPDATE query is important. Note that the names of the parameters specified in UPDATE statement are matching the table column names. The UPDATE statement contains three parameters - @FirstName, @LastName and @EmployeeID. These parameters are then added to the UpdateParameters collection.

Configuring the GridView control

The GridView control uses SqlDataSource1 as its data source. This is indicated by setting the DataSourceID property of GridView. Further some properties of GridView are set. Note that you need to set these properties only once and hence they come inside the "if" condition. The AutoGenerateColumns property indicates whether to generate GridView columns automatically. We set this property to false as we wish to add them via code. The DataKeyNames property is a string array specifying the primary key columns. The AllowPagng and AllowSorting properties enable paging and sorting feature respectively. The PageSize property sets the page size to 5.

Creating Bound Fields

The GridView control can contain many types of columns such as BoundField, HyperLinkField and TemplateField. In this example we will be using BoundField columns. We need three bound fields for EmployeeID, FirstName and LastName respectively. A bound field is represented by a class called BoundField. The HeaderText property of BoundField class indicates the column heading. The DataField property indicates the name of the table column that you wish to display in the bound field. The SortExpression property governs if that bound field will be sortable or not. If you set the SortExpression property to a column name then the bound field will be sortable based on that column. Since EmployeeID bound field represents primary key we set its ReadOnly property to true. This way it won't be editable.

In order to provide editing feature you need to add a CommandField column to the GridView. The ButtonType property of CommandField class indicates the type of button to render. Possible values are Button, LinkButton and ImageButton. The ShowCancelButton and ShowEditButton properties decide if the Edit and Cancel buttons will be displayed.

Once we create the columns they need to be added to the Columns collection of GridView.

That's it! If you run the web form then it should look as shown below:



You can now test GridView features such as paging sorting and editing.






Posted by SB패밀리

Creating GridView Columns Dynamically (Part 1, 2) 소스코드



Introduction

Few months back I wrote article on how to create DataGrid programatically. The article explained how to created a DataGrid with bound columns on the fly. Many readers asked whether we can do similar thing with templated columns. This two part article explains just that. There are actually two ways to create DataGrid templated columns dynamically - using LoadTemplate method and implementing ITemplate interface. In Part - I, we will discuss how to use the first method i.e. using LoadTemplate.

What are templates anyway?

ASP.NET list controls like DataGrid, DataList and Repeater allow flexibility in changing look and feel via the use of what is called as 'Templates'. As the name suggests template is a blue print of look and feel for data displayed in certain areas of the control. For example, HeaderTemplate represents blue print of the header of the control. Similarly, ItemTemplate represents individual item or row of the DataGrid. These sectons are represented by markup like <ItemTemplate> and <HeaderTemplate>.

LoadTemplate method

If you see the class hierarchy of Page class it looks like this:
System.Object
   System.Web.UI.Control
      System.Web.UI.TemplateControl
         System.Web.UI.Page
The System.Web.UI.TemplateControl class contains a method called LoadTemplate that can be used to dynamially load temlates for templated controls. The signature of LoadTemplate is like this:
public ITemplate LoadTemplate
(string virtualPath);
The method takes virtual path of a user control file i.e. .ascx file.

Creating user control file for template markup

You should store markup of the template in .ascx file. Remember that the markup should not contain actual tags like <ItemTemplate>. Typically this file will not be having any other markup. Note that one such file represents markup for one kind of template.

Example of using LoadTemplate method

We will now develop an example in which we will create a DataGrid on the fly with a single template column. The template column simply contains a Label control but you can add any other controls as well. Our example will need to follow steps given below:
  • Create a new ASP.NET web application
  • Create a new web form
  • Create a user control file (.ascx) for template markup
  • Write code to add a DataGrid to the form
  • Load the template from the .ascxfile
  • Bind the DataGrid with some datasource
Out of above steps first two are common to any web application and we will not discuss them here. So, let us start by creating a user control file for our template.

User control file for our example

You may add a new web user control (.ascx) to your project. Add following markup to the file:
<%@ Control Language="C#" %>
<asp:label ID="label1" Runat="server" 
text='<%# Databinder.Eval
(((DataGridItem)Container).DataItem,"lastname")%>'>
</asp:label>
Note that this markup looks same as if we would have used it in design mode. Here, we are binding a label control with the lastname field from the DataMember.

Adding DataGrid to the form

Add following code to the Page_Load event of the web form
string connstr = 
@"Integrated Security=SSPI;User ID=sa;Initial 
Catalog=Northwind;Data Source=MyServer\NetSDK";
SqlConnection cnn=new SqlConnection(connstr);
SqlDataAdapter da=
new SqlDataAdapter("select * from employees", cnn);
DataSet ds=new DataSet();
da.Fill(ds, "employees");
ITemplate temp= Page.LoadTemplate("webusercontrol1.ascx");
TemplateColumn tc=new TemplateColumn();
tc.HeaderText = "Last Name";
tc.ItemTemplate = temp;
DataGrid1.Columns.Add(tc);
DataGrid1.DataSource = ds;
DataGrid1.DataMember = "employees";
DataGrid1.DataBind();
Most of the code will be familiar to you except code related to ITemplate. We have loaded our template using LoadTemplate method. We then create a TemplateColumn and set its ItemTemplate to it. Even though we have used ItemTemplate, it can be any other type of template also like EditItemTemplate. We then add this new column to the DataGrid. Note that our DataGrid instance DataGrid1 is declared at class level and hence not visible in the code shown above.

After running your application you should get a DataGrid with single templated column titled 'Last Name'.

Summary

In this article we saw how to add a templated column to a DataGrid on the fly using LoadTemplate method. This method can be used if you want to use same DataGrid with say few columns changing at run time. In the next part we will see how to create templated columns via implementing ITemplate interface. Till then keep coding!


Bipin Joshi is software consultant, trainer and author having 20+ years of experience in software development. He conducts professional courses in ASP.NET MVC, jQuery, HTML5 and Design Patterns in Thane. He is a published author and has authored or co-authored books for Apress and Wrox press. To know more about him click here. To know more about his training programs go here.

Get connected : Twitter  Facebook  Google+  LinkedIn



gridviewdyncolumns.zip



Creating GridView Columns Dynamically Part 1

http://www.binaryintellect.net/articles/331ed95f-d49f-4664-a9f7-768d6e11beb0.aspx

Creating GridView Columns Dynamically Part 2

http://www.binaryintellect.net/articles/0b4f8e1c-39e6-4070-abc0-7a970e7553bc.aspx


download source code


Posted by SB패밀리

출처: 인터넷



미디어 플레이어 객체 제어하기
* 조절메서드
  - Pause() : 일시정지합니다.
  - Play() : 재생합니다.
  - Stop() : 중지합니다.
  - Next() : 다음으로 이동합니다.
  - Previous() : 이전으로 이동합니다.
* PlayState속성 - 재생, 중지, 일시정지 중인지의 상태를 알아냅니다.
  -- mpStopped : [0] 재생이 중지된 상태
  -- mpPaused : [1] 재생이 일시정지된 상태
  -- mpPlaying : [2] 재생중인 상태
  -- mpWaiting : [3] 시작하기 위해서 기다리는 상태
  -- mpScanForward : [4] 재생흐름을 다음으로 이동
  -- mpScanReverse : [5] 재생흐름을 이전으로 이동
  -- mpSkipForward : [6] 다음 단계로 이동
  -- mpSkipReverse : [7] 이전 단계로 이동
  -- mpClosed : [8] 재생닫혀있는 상태
* DisplaySize속성 - 화면크기를 조절합니다.
  -- mpDefaultSize : [0] 기본크기
  -- mpHalfSize : [1] 기본크기에서 1/2크기
  -- mpDoubleSize : [2] 기본크기에서 두배로 확대한 크기
  -- mpFullScreen : [3] 화면 전체크키
  -- mpFitToSize : [4] 사용자가 디자인한 크기
  -- mpOneSixteenScreen : [5] 전체화면의 1/16크기
  -- mpOneFourthScreen : [6] 전체화면의 1/4크키
  -- mpOneHalfScreen : [7] 전체화면의 1/2크기
* Mute속성 - 소리를 끄거나 켜기위해 사용됩니다.
   Boolean값이 True이면 소리가 꺼진 상태이고 False이면 소리가 켜진 상태입니다.

# 윈도우 미디어플레이어 속성
AllowChangedDisplayMode 초단위, 프레임 단위로 최종 사용자가 디스플레이 모드를 실행시 변경할 수 있는지를 나타낸다.
AllowHideControls 최종 사용자가 컨트롤 패널을 실행시 감출 수 있는지를 나타낸다. 
AllowHideDisplay 최종 사용자가 디스필레이를 실행시 감출 수 있는지를 나타낸다. 
Apperance 디스플레이 패널의 경계의 모양을 지정한다. 1=inset border 패인모양, 0=무경계 
AutoRewind 파일의 재생이 끝났을 때 자동으로 되감기를 할 것인지를 표시한다.
AutoStart 웹페이지를 열면 자동으로 재생을 시작할 것인지를 표시한다.
Balance 소리의 균형을 나타낸다. 0=균형, -10,000=왼쪽스피커만 사용, 10,000=오른쪽 스피커만 사용 
BorderStyle 컨트롤 경계 스타일을 지정한다. 0=무사용, 1=고정된 싱글 경계 
CurrentPosition 재생 파일에서의 현 위치를 초 단위로 나타낸다. 
CurrentState 플레이어의 현 상태를 나타낸다. 0=정지, 2=재생, 1=일시정지 
DisplayBackColor 디스플레이 패널의 배경색을 나타낸다. 
DisplayForeColor 디스플레이 패널의 전경생을 나타낸다. 
DisplayMode 디스플레이 패널에 초단위 또는 프레임 단위로 현위치를 디스플레이할지를 나타낸다. 0=초, 1=프레임 
EnableContextMenu 단축 메뉴를 활성화시킬지를 나타낸다.
Enabled 컨트롤이 활성화되었는지를 나타낸다.
EnablePositionControls 컨트롤 패널에 위치 버튼을 보여줄 것인지를 표현한다.
EnableSelectControls 컨트롤 패널에 선택 버튼을 보여줄 것인지를 표현한다.
EnableTracker 컨트롤 패널에 트랙바 컨트롤을 보여줄 것인지를 표시
FileName 재생될 멀티미디어 파일을 지정한다. 
FullScreenMode 모니터 전체의 크기로 멀티미디어를 표시한다. 
MovieWindowSize 재생 패널의 크기를 결정한다. 0=원래크기, 1=원래크기의 2배, 2=화면의 1/6크기, 3=화면의 1/4 
PlayCount 재생할 횟수를 지정한다. 
Rate 재생 비율을 결정한다. 
ReadyState 소스 파일을 얼마나 로드했는가에 따른 Active Movie Control의 준비 상태를 나타낸다. 
SelectionEnd 파일의 처음에서부터 종료 위치를 초 단위로 지정한다. 
SelectionStart 파일의 처음에서부터 시작 위치를 초 단위로 지정한다. 
ShowControls 컨트롤 패널 표시 여부를 지정한다.
ShowDisplay 디스플레이 패널 표시 여부를 지정한다.
ShowPositionControls 위치 컨트롤의 표시 여부를 지정한다.
ShowSelectControls 선택 컨트롤의 표시 여부를 지정한다.
ShowTracker 트랙바의 표시 여부를 지정한다.
Volume 데이벨의 100분의 1 단위로 볼륨을 지정한다.
.. 그외 자세한 사항은 MSDN:Windows Media Player Properties를 참고하기 바랍니다.



----------------------------------------------------------------------------------------



<html>
<script language="JavaScript">
<!--



function mmp_state() {  /* 재생상태를 출력 */
switch(mmp.PlayState) {
  case 0 : frm1.state.value = "중지상태";
   break;
  case 1 : frm1.state.value = "일시중지";
   break;
  case 2 : frm1.state.value = "실행중";
   break;
}
}



function mmp_play() {  /* 재생 */
if (mmp.Filename!="")
  mmp.Play();
mmp_state();
}



function mmp_stop() {  /* 멈춤 */
if (mmp.Filename!="")
  mmp.Stop();
mmp_state();
}



function media_size(my_sel) {  /* 화면크기조정 */
switch(my_sel) {
  case 0 : mmp.DisplaySize = 0;
   break;
  case 2 : mmp.DisplaySize = 2;
   break;
  case 3 : mmp.DisplaySize = 3;
   break;
}
}



function mmp_pause() {  /* 일시멈춤 */
if (mmp.Filename!="")
  mmp.Pause();
mmp_state();
}



function mmp_sound() {  /* 소리제어 */
if (mmp.Filename!="") {
  if (mmp.Mute == true) {
   mmp.Mute = false;
   frm1.sound.value = "소리켬";
  } else {
   mmp.Mute = true;
   frm1.sound.value = "소리끔";
  }
}
}



-->
</script>



<body>
<div align="center">

<object classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95" codeBase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" id="mmp" style="left:0px; top:0px; width:320px; height:240;">
<param name="AudioStream" value=-1>
<param name="AutoSize" value=-1>
<param name="AutoStart" value=-1>  <!-- 웹페이지를 열면 자동으로 재생을 시작할 지 설정 -->
<param name="AnimationAtStart" value=-1>
<param name="AllowScan" value=-1>
<param name="AllowChangeDisplaySize" value=-1>
<param name="AutoRewind" value=0>  <!-- 파일의 재생이 끝났을 때 자동으로 되감기를 할 지 설정 -->
<param name="Balance" value=0>  <!-- 스피커의 음량분배, 0=균형, -10,000=왼쪽스피커만 사용, 10,000=오른쪽 스피커만 사용  -->
<param name="BaseURL" value="">
<param name="BufferingTime" value=5>
<param name="CaptioningID" value="">
<param name="ClickToPlay" value=-1>
<param name="CursorType" value=0>
<param name="CurrentPosition" value=1>  <!-- 재생 파일에서의 현 위치를 초 단위로 나타낸다.  -->
<param name="CurrentMaker" value=0>
<param name="DefaultFrame" value="">
<param name="DisplayBackColor" value=0>  <!--  디스플레이 패널의 배경색을 나타낸다.  -->
<param name="DisplayForeColor" value="16777215">  <!-- 디스플레이 패널의 전경색 -->
<param name="DisplauMode" value=0>  <!-- 디스플레이 패널에 초단위 또는 프레임 단위로 현위치를 디스플레이할지를 나타낸다. 0=초, 1=프레임 -->
<param name="DisplaySize" value=0>
<param name="Enabled" value=-1>  <!-- 컨트롤이 활성화되었는지를 나타낸다. -->
<param name="EnableContextMenu" value=-1>  <!-- 단축 메뉴를 활성화시킬지를 나타낸다. -->
<param name="EnablePositionControls" value=-1>  <!-- 컨트롤 패널에 위치 버튼의 출력설정 -->
<param name="EnableFullscreenControls" value=0>
<param name="EnableTracker" value=-1>  <!-- 컨트롤 패널에 트랙바 컨트롤을 보여줄 지를 표시 -->
<param name="Filename" value="king_1118.asf">  <!-- 재생될 멀티미디어 파일을 지정한다. -->
<param name="InvokeURLs" value=-1>
<param name="Language" value=-1>
<param name="Mute" value=0>
<param name="PlayCount" value=1>  <!-- 재생할 횟수를 지정한다.  -->
<param name="PreviewMode" value=0>
<param name="Rate" value=1>  <!-- 재생 비율을 결정한다.  -->
<param name="SAMILang" value="">
<param name="SAMIStyle" value="">
<param name="SAMIFileName" value="">
<param name="SelectionStart" value=-1>  <!-- 파일의 처음에서부터 시작 위치를 초 단위로 지정 -->
<param name="SelectionEnd" value=-1>  <!--  파일의 처음에서부터 종료 위치를 초 단위로 지정 -->
<param name="SendOpenStateChangeEvents" value=-1>
<param name="SendWarnigEvents" value=-1>
<param name="SendErrorEvents" value=-1>
<param name="SendKeyboardEvents" value=0>
<param name="SendMouseClickEvents" value=0>
<param name="SendMouseMoveEvents" value=0>
<param name="SendPlayStateChangeEvents" value=-1>
<param name="ShowCaptioning" value=0>
<param name="ShowControls" value=0>  <!-- 컨트롤 패널 표시 여부를 지정한다 -->
<param name="ShowAudioControls" value=0>
<param name="ShowDisplay" value=0>  <!-- 디스플레이 패널 표시 여부를 지정한다.  -->
<param name="ShowGotoBar" value=0>
<param name="ShowPositionControls" value=0>  <!--  위치 컨트롤의 표시 여부를 지정한다.  -->
<param name="ShowStatusBar" value=0>
<param name="ShowTracker" value=-1>  <!-- 트랙바의 표시 여부를 지정한다. -->
<param name="TransparentAtStart" value=0>
<param name="VideoBorderWidth" value=0>
<param name="VideoBorderColor" value=0>
<param name="VideoBorder3D" value=0>
<param name="Volume" value=-600>  <!-- 데시벨의 100분의 1 단위로 볼륨을 지정한다.  -->
<param name="WindowlessVideo" value=0>
</object>



<form name="frm1">
<input type="button" name="play" value="실행" onClick="mmp_play()">
<input type="button" name="stop" value="중지" onClick="mmp_stop()">
<input type="button" name="next" value="일시중지" onClick="mmp_pause()">
<input type="button" name="sound" value="소리 켬" onClick="mmp_sound()">
<br><br>
<input type="button" name="size1" value="기본크기" onClick="media_size(0)">
<input type="button" name="size2" value="두배크기" onClick="media_size(2)">
<input type="button" name="size3" value="전체크기" onClick="media_size(3)">
<br><br>
상태 : <input type="text" name="state" value="실행중">

</form>



</div>
</body>
</html>

Posted by SB패밀리



jisikin.zip



comment를 이용하여 구성하였는데
나는 답변을 가지고 만들어야 겠다.
=======================================================================================================
네이버지식인 비슷한 게시판 스킨입니다.
제로보드를 사용해본지가 벌써 반년이넘었네요..
오랜만에 다시 만들어보는 스킨이라서 꼬박 하루가 걸렸네요.. -.-
암튼 네이버의 지식인을 따라해보았습니다. 보시고 필요하신분들은 사용해보세용~

*간단한 기능설명
질문자는 자신이 보유한 포인트내에서 최고 100포인트까지 내공을 걸수있습니다. 
회원들 누구나 답변을 할 수 있으며 답변이 채택되면 질문자가 건 내공만큼의 내공포인트가 자동으로 적립됩니다. 
답변채택은 질문자만이 할 수 있습니다. 
질문자는 답변글을 달지 못합니다. 
답변채택이 완료된 후에는 해당글을 수정하지 못합니다. 
답변완료전에 해당글을 수정할때에는 내공은 수정할 수 없습니다. 
제시한 내공은 글작성 완료시 자동으로 차감되며 수정시 이중차감되진 않습니다. 
본스킨은 제로보드의 여유필드 x,y필드를 모두 사용하였습니다. 
본스킨을 이용한 게시판에서는 별도로 x,y필드를 사용하실 수 없습니다. 
기타등등... ^.^; 
  
*설치방법 
1.첨부된 파일중 jisikin.zip파일을 다운받아 압축을 해제하신 후 jisikin폴더를 제로보드 스킨폴더에 업로드 합니다. 
  
2.제로보드 관리자로 접속하여 지식인으로 사용할 게시판을 생성하신 후 jisikin스킨을 적용하고 코멘트 작성권한을 회원이상(비회원은 작성할 수 없게)으로 설정합니다. 
  
3.생성된 지식인게시판의 코멘트테이블에 byul 이라는 필드를 추가로 생성해줍니다. 
(필드명은 byul, 형식은 VARCHAR 길이는 10 으로 생성합니다.) 
  
3-1. 만일 필드추가를 잘 모르시는 초보님들은 http://자신의 도메인/제로보드/skin/jisikin/mkfild.php 를 웹상에서 호출하시면 자동으로 필드생성하는 페이지가 나옵니다. 거기에서 지식인게시판으로 생성한 게시판의 영문이름만 넣으시고 버튼만 누르시면 자동으로 필드생성이 되어집니다. 
  
4.제로보드안의 write_ok.php파일 열어보시면 아래와 같은 부분이 있습니다. 
거의 하단부분 신규글쓰기일때 아래쪽에 보시면 
  
// 회원일 경우 해당 해원의 점수 주기
if($mode=="write"||$mode=="reply") @mysql_query("update $member_table set point1=point1+1 where no='$member[no]'",$connect) or error(mysql_error());

위와 같은 곳이 있습니다. 위 부분 아래에 
  
//지식인게시판일경우 내공 차감하기
$jisiktb=array(test,test2,jisik,jisik3);
$jisiktb2=$id;
$downpoint = $zx*0.1;
if($mode=="write" AND in_array($id,$jisiktb)) @mysql_query("update $member_table set point1=point1-$downpoint where no='$member[no]'",$connect) or error(mysql_error()); 
  
위의 글을 복사하여 추가해 넣습니다. 
여기서 주의할 사항은 추가된 부분중에 
$jisiktb=array(test,test2,jisik,jisik3); 
부분이 있는데 여기서 괄호안에는 지식인게시판으로 사용될 게시판 영문이름을 넣어주셔야합니다. 
예를 들어 jisikin이라고 생성하셨다면 
$jisiktb=array(jisikin); 
위와같이 바꿔주시면 되고 나중에 지식인 게시판이 추가되면 콤마(,)로 구분하여 넣어주시면 됩니다. 
  
설치끝~! 
  
최대한 수정없이 스킨파일만으로 끝내려고 갖은애를 썼으나 내공 및 기타 설정때문에 부득이하게 약간의 파일수정작업이 필요하게 되었네요.. ^.^ 
  
잘 안되시거나 문의사항있으시면 코멘트나 제 홈페이지에 글남겨 주세요.

설명이길어 이미지 첨부는 생략하고 미리보기는 링크주소를 이용하세용... ^.^


추가) 미리보기 게시판에서 보실 수 없는 질문자 로그인시의 답변채택이미지만 첨부하여 올립니다. ^.^

출처: 인터넷

Posted by SB패밀리

외부응용프로그램 실행하기 (Process.Start 메서드)


윈도우를 종료
System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -s -f -t 00");


윈도우를 재부팅

System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -r -f -t 00");

 

특정 폴더 열기
System.Diagnostics.Process.Start("explorer.exe", "C:\\Temp");

특정 사이트 열기
System.Diagnostics.Process.Start("explorer.exe", "http://www.naver.com");

 

도스명령어 실행

System.Diagnostics.Process.Start("cmd.exe","/c dir");

// cmd 옵션에 대해 더 알고싶으면.. c:\>help cmd

 

Process.Start 메서드 사용형식
 

using System.Diagnostics;

//System.Diagnostics 네임스페이스는 시스템 프로세스, 이벤트 로그 및 성능 카운터와 상호 작용할 수 있는 클래스를 제공합니다.

 

public bool Start();
//이 Process 구성 요소의 StartInfo 속성으로 지정된 프로세스 리소스를 시작하거나 다시 사용하여 구성 요소에 연결합니다.

 

Process myProcess = new Process();
string myDocumentsPath =   Environment.GetFolderPath(Environment.SpecialFolder.Personal);
myProcess.StartInfo.FileName = myDocumentsPath + "
\\MyFile.doc";
myProcess.StartInfo.Verb = "Print";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();

 

public static Process Start( ProcessStartInfo startInfo);
// ProcessStartInfo : 파일 이름 및 모든 명령줄 인수를 포함하여 프로세스를 시작하는 데 사용되는 정보
// 시작할 프로세스의 파일 이름 같은 프로세스 시작 정보가 포함된 매개 변수에 의해 지정된
// 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

 

ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
startInfo.Arguments = "
www.naver.com";
Process.Start(startInfo);

 

public static Process Start(string fileName);
// fileName : 프로세스에서 실행될 응용 프로그램 파일 이름입니다.

//문서 또는 응용 프로그램 파일 이름을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

 

Process.Start("IExplore.exe");

 

public static Process Start(string fileName, string arguments);
// arguments : 프로세스를 시작할 때 전달할 명령줄 인수입니다

//응용 프로그램 이름 및 명령줄 인수 집합을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다.

 

Process.Start("IExplore.exe", "C:\\myPath\\myFile.htm");
Process.Start("IExplore.exe", "C:\\myPath\\myFile.asp");

 

 

Process 클래스

Process 구성 요소는 컴퓨터에서 실행 중인 프로세스에 대한 액세스를 제공합니다. 간단히 말해 프로세스란 실행 중인 응용 프로그램을 말합니다.

 

Process 구성 요소는 응용 프로그램의 시작, 중지, 제어 및 모니터링을 위한 유용한 도구입니다.
Process 구성 요소를 사용하면 실행 중인 프로세스의 목록을 얻거나 새로운 프로세스를 시작할 수 있습니다. 또한 Process 구성 요소를 사용하여 시스템 프로세스에도 액세스할 수 있습니다.
Process 구성 요소를 초기화한 후에는 해당 구성 요소를 사용하여 실행 중인 프로세스에 대한 정보를 얻을 수 있으며 그러한 정보에는 스레드 집합, 로드된 모듈(.dll 및 .exe 파일), 프로세스가 사용하고 있는 메모리 양과 같은 성능 정보 등이 포함됩니다.

 

프로세스 구성 요소는 속성 그룹에 대한 정보를 한 번에 가져옵니다. Process 구성 요소가 특정 그룹의 한 멤버에 대한 정보를 가져올 때 해당 그룹의 나머지 속성 값이 캐싱되므로 Refresh 메서드를 호출하지 않는 한 그룹의 다른 멤버에 대한 새로운 정보를 가져오지 않습니다. 따라서 속성 값이 Refresh 메서드를 마지막으로 호출하여 얻은 속성 값과 같을 수 있습니다. 이러한 그룹 명세는 운영 체제에 따라 다릅니다.

 

더 자세한 사항은 Microsoft Visual Studio .NET 2003 도움말에서 Process 클래스를 참고하세요.

출처 : http://blog.naver.com/tear230/100002921976

쌈꼬쪼려 소백촌닭
Posted by SB패밀리


DataSet에 있는 내용을 엑셀로 다운로드 하기 위해서 DataGrid를 사용합니다.
DataGrid 클래스를 생성하여 DataSet을 바인딩한 다음 엑셀에 보여질 스타일등을 지정해준 다음
해당 웹페이지에 Response 하면 됩니다.

 

private void Page_Load(object sender, System.EventArgs e)
{

    // 엑셀로 만들 데이터를 DataSet에 채웁니다.
    DataSet dsResult = GetMemberList();  

 

    // DataGrid와 DataTable의 각 필드에 상응하는 BoundColumn을 만들어 ArrayList에 추가합니다.

    ArrayList arrColumn = new ArrayList();
    arrColumn.Add(CreateBoundColumn("MEMID", "아이디"));
    arrColumn.Add(CreateBoundColumn("MEMNAME", "이름"));
    arrColumn.Add(CreateBoundColumn

            ("JOINDATE", "가입일", "{0:yyyy/MM/dd}", HorizontalAlign.Center));
    arrColumn.Add(CreateBoundColumn

            ("MILEAGE", "포인트", "{0:###,##0}", HorizontalAlign.Center));

 

    string fileName = "members_" + DateTime.Now.ToString("yyyyMMdd") + ".xls";

    SaveAsExcel(dsResult, arrColumn, "회원리스트", fileName);
}

 

public void SaveAsExcel(DataSet dsResult, ArrayList columns, string subject, string fileName)
{

    // 다운로드시 사용할 파일명을 설정합니다.
    if(fileName.Equals(null) && fileName.Equals(""))
        fileName = DateTime.Now.ToString("yyyyMMdd")+".xls";

 

    System.Web.HttpContext.Current.Response.Buffer = true;

 

    // DataGrid를 생성합니다.

    DataGrid dgExcel = new DataGrid();
    dgExcel.ShowHeader = true;

    dgExcel.Caption =  subject;

 

    // DataGrid에 Header 텍스트를 추가합니다.
    dgExcel.AutoGenerateColumns = false;

    foreach(object column in columns)
        dgExcel.Columns.Add((BoundColumn)column);

 

   // DataGrid의 스타일을 지정합니다.

    dgExcel.HeaderStyle.BackColor = Color.FromName("powderblue");
    dgExcel.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
    dgExcel.HeaderStyle.Height = 25;
    dgExcel.HeaderStyle.Font.Bold = true;

 

    // DataGrid에 DataSet의 내용을 채웁니다.

    dgExcel.DataSource = dsResult;
    dgExcel.DataBind();

 

    // DataGrid를 웹페이지에 쓰기 시작...

 

    System.Web.HttpContext.Current.Response.AddHeader
        ("Content-Disposition", string.Format("attachment;filename={0}", fileName));
    System.Web.HttpContext.Current.Response.ContentType = "application/unknown";
    // System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

 

    /////////////////////////////////////////////////////////////////////////////////////////////////
    ///  한글이 깨지는 경우 web.config의 globalization을 euc-kr로 바꿔주세요.
    /// <globalization requestEncoding="euc-kr" responseEncoding="euc-kr" />
    /////////////////////////////////////////////////////////////////////////////////////////////////

    System.Web.HttpContext.Current.Response.Write
        ("<meta http-equiv=Content-Type content='text/html; charset=ks_c_5601-1987'>");

 

    dgExcel.EnableViewState = false;


    System.IO.StringWriter sWriter = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(sWriter);

    dgExcel.RenderControl(htmlWriter);

 

    System.Web.HttpContext.Current.Response.Write(sWriter.ToString());
    System.Web.HttpContext.Current.Response.End();


    dgExcel.Dispose();
}

 

// DataGrid의 반복적인 컬럼 생성 작업을 하는 메서드입니다.

public BoundColumn CreateBoundColumn(string DataFieldValue, string HeaderTextValue)
{
    // Create a BoundColumn.
    BoundColumn column = new BoundColumn();

 

    // Set the properties of the BoundColumn.
    column.DataField = DataFieldValue;
    column.HeaderText = HeaderTextValue;
    return column;
}

 

public BoundColumn CreateBoundColumn

   (string DataFieldValue, string HeaderTextValue, string FormatValue, HorizontalAlign AlignValue)
{
  
  // Create a BoundColumn using the overloaded CreateBoundColumn method.
    BoundColumn column = CreateBoundColumn(DataFieldValue, HeaderTextValue);

 

    // Set the properties of the BoundColumn.
    column.DataFormatString = FormatValue;
    column.ItemStyle.HorizontalAlign = AlignValue;
    return column;
}




쌈꼬쪼려 소백촌닭
Posted by SB패밀리

ItemIndex 속성을 사용하여 DataGrid, DataList, Repeater 컨트롤의 Items 컬렉션에서 가져온 DataGridItem, DataListItem, Repeateritem 개체의 인덱스 번호를 확인합니다.

<asp:Repeater id="Repeater1" runat="server">
    <ItemTemplate>
            <td><%# Container.ItemIndex+1 %> </td>

    </ItemTemplate>
</asp:Repeater>

 

위에서 1을 더해주는 이유는 ItemIndex0부터 시작하기 때문에 1부터 표시해주기 위해서 이다.

쌈꼬쪼려 소백촌닭

Posted by SB패밀리

asp.net 페이지를 옮겨다니면서 이전 페이지나 다른 페이지의 객체 자체를 넘겨 볼 수 없을까... 생각하다가...
세션을 생각했습니다.
세션에도 객체가 담기니까요...
하지만 역시 세션은 서버에 부담을 주기 때문에...
어떤 방법이 없을까... 생각하다가... 데브피아에서 정보를 얻었습니다.
 
아래의 예를 참고 하세요.

// A Page

DataTable dtable = mySaveItems();   
Context.Items.Add("data", dtable);
Server.Transfer("B.aspx"); 

// B Page

object data = Context.Items["data"];
if(data != null)
{
    dtData = data as DataTable;
}


쌈꼬쪼려 소백촌닭

Posted by SB패밀리

WEB의 HTML, 자바스크립트로 Get 방식으로 한글 문자열을 넘겨줄 때 인코딩 문제를 해결해 봅니다.
asp.net 소스로 구현되어있습니다.

ASP.NET에서 GET방식을 이용해서 넘겨준 한글 문자열을 Request로 받을 때,
인코딩 문제로 한글이 깨져서 보입니다.

그럴때는 한글 문자열을 인코딩해서 보내고 받는 방법을 사용해야 합니다.
Server Script(서버 스크립트)를 사용해서 보낼 때 HttpUtility.UrlEncode(string) 메소드를 이용하시면 되고,
Javascript(자바스크립트)에서 바로 보낼 때 사용하시려면 escape(string) 함수를 이용하시면 됩니다.

[Server Script]

Response.Redirect("movepage.aspx?name=" + HttpUtility.UrlEncode("홍길동"))

[Javascript]

document.location.href = "movepage.aspx?name=" + escape("배철수");

그 외 ServerUtilty.UrlEncode, UrlHtmlEncode 등의 함수도 참고하십시오.
쌈꼬쪼려 소백촌닭

Posted by SB패밀리

자바스크립트 개발에서 자식창에서 부모창이 갖고 있는 이벤트를 실행하는 방법입니다.

-----------------------------------

자식창에 있는 값을 부모창에 바로 반영하고 싶을 경우
보통 스트립트로 자식창의 값을 부모창에 넘긴다음
부모창의 변경된 내용을 submit시킴으로써 일괄적으로 처리합니다.

하지만 가끔 자식창에서 부모창으로 값을 넘기면서 바로 DB처리를 해야 할 경우가 있을지도 모릅니다. 그럴때 이용하는 방법입니다.

다음은 자식창에서 입력한 텍스트값을 부모창의 링크버튼 이벤트를 이용하여
부모창의 리스트박스에 추가하는 소스로 두가지 방법을 사용해서 만들어 보았습니다.

자세한 내용은 첨부한 소스코드를 참고하세요.

 

--- 아래는 팝업페이지의 소스코드 일부입니다..

 

  <script language="javascript">
  <!--
   // __doPostBack에 인지값을 직접 넘기는 방법
   function ListBoxAdd1()
   {
    var strValue = document.all["txtValue"].value;
    opener.__doPostBack('lnkEvent1', strValue);
   }
   
   // 부모창의 hidden input 으로 넘겨서 받는 방법
   function ListBoxAdd2()
   {
    opener.document.all["hidValue"].value = document.all["txtValue"].value;
    opener.__doPostBack('lnkEvent2', '');
   }
  //-->
  </script>

 

   <INPUT type="text" id="txtValue">
   <INPUT type="button" value="추가(방법1)" onclick="ListBoxAdd1();">
   <INPUT type="button" value="추가(방법2)" onclick="ListBoxAdd2();">

 

-- 아래는 부모창의 소스코드 일부입니다.

-- 자식창에서 __doPostBack을 사용하시려면 링크버튼을 이용하시는게 편리합니다.

-- 링크버튼을 사용하시면  컴파일후 부모창에  __doPostBack 스크립트 함수를 자동으로 생성해주기 때문이죠.

 

<aspx>

    <asp:ListBox id="ListBox1" runat="server">
     <asp:ListItem Value="선택하세요">값을 추가해주세요.</asp:ListItem>
    </asp:ListBox>

 

    <asp:LinkButton id="lnkEvent1" runat="server"></asp:LinkButton>
    <asp:LinkButton id="lnkEvent2" runat="server"></asp:LinkButton>
   <input type="hidden" id="hidValue">

 

<cs>

        // RaisePostBackEvent를 이용해서 인자값 받기

        string newValue = null;
        protected override void RaisePostBackEvent

                (IPostBackEventHandler sourceControl, string eventArgument)
        {
                newValue = eventArgument;
                base.RaisePostBackEvent (sourceControl, eventArgument);
        }
        private void lnkEvent1_Click(object sender, System.EventArgs e)
        {
                if(newValue != null)
                         ListBox1.Items.Add(newValue );
        }

 

        // hidden값에 인자값을 넣어서 받기

        private void lnkEvent2_Click(object sender, System.EventArgs e)
        {
                if(Request["hidValue"] != null)
                        ListBox1.Items.Add(Request["hidValue"]);               
        }


출처 : http://blog.naver.com/tear230/100012963979

Posted by SB패밀리

function f_goEnter() {
   if ( event.keyCode == 13 ) {
    f_submit();
   }
  }
Posted by SB패밀리

private void Page_Load(object sender, System.EventArgs e)
{
    string fullName = "SampleProject.Resources.AppResources";

    System.Reflection.Assembly Assem = System.Reflection.Assembly.GetExecutingAssembly();
    ResourceManager appResourceMgr = new ResourceManager(fullName, Assem);

    Button1.Text = appResourceMgr.GetString("Msg.Click");
    Label1.Text = appResourceMgr.GetString("Msg.Welcome");
}

 

 

실제 Resx 파일로부터 데이터를 가져오기 위해서 필요한 핵심 클래스는 바로 ResourceManager 입니다. 이 친구가 특정 resx 파일로부터 우리가 원하는 데이터를 뽑아올 수 있도록 도와주는 클래스이거든요. 이 클래스의 더욱 구체적인 설명은 MSDN에서 한번 찾아보시길 권해드립니다.

일단, ResourceManager 클래스는요. 사용법이 간단합니다. 클래스의 인스턴스를 만들면서 생성자에 2가지의 매개변수를 지정해 주시면 되거든요. 즉, 우리가 사용하려는 리소스 파일의 논리적인 이름(전체 이름)을 첫번째 인자로 그리고, 사용하려는 리소스 파일이 들어있는 어셈블리를 두번째 인자로 지정해 주시면 되는 것입니다.

그렇다면, 우리가 사용하려는 리소스 파일의 논리적인 이름 즉, 루트 이름은 어떻게 알 수 있을까요? 이 이름은 네임스페이스를 포함한 리소스의 명칭을 말하는 것이잖습니까? 그렇기에, 일단 그 명칭의 시작은 프로젝트의 네임스페이스인 SampleProject. 으로 시작하겠죠? 그리고, 현재 Resources 라는 폴더안에 들어있으므로, 완전한 명칭은 SampleProject.Resources.AppResources이 될 것입니다.

물론, 이것은 C#인 경우 그런 것이구요. VB.NET으로 프로젝트를 만드셨다면 이야기가 약간 달라집니다. 왜냐하면, C#은 기본적으로 컴파일 시에, 폴더가 있으면 그 폴더 이름을 네임스페이스에 추가해서 달고 가는 반면, VB.NET은 그 폴더명을 무시하거든요. 즉, 현재의 경우 C# 프로젝트이고, 우리가 사용하려는 리소스 파일이 Resources 폴더 안에 있으니,

SampleProject.Resources.AppResources

가 완전한 리소스 파일의 논리적인 이름이 되겠지만, VB.NET의 경우는 폴더명을 무시하기에

SampleProject.AppResources

가 된다는 것입니다. ^^;; (맨 뒤에 .resx가 없는 것에 주의하세요 ^^)

 

근데, 왜 그림에서는 경로의 마지막에 .resources 라는 것이 붙어있냐고 물어보시려 하시는구려~

그것은 이것이 리소스 파일이기 때문에 붙여지는 것이랍니다. 원래 우리눈에 보기에 .resx 였던 것의 본명이 제대로 붙여진 것이지요 ^^;; 하지만, ResourceManager 클래스를 이용해서 리소스 파일을 로드하는 경우에는 전체 경로에서 .resources 라는 부분은 무시하셔도 됩니다. 왜냐하면, ResourceManager 를 이용하면 이 친구는 알아서 .resources로 끝나는 리소스들을 찾게 되니까요 ^^

자. 장황하긴 했지만 특정 리소스 파일의 논리적인 루트경로를 어떻게 알아낼 수 있는지 이야기를 해 보았습니다. 이제 다시 원래의 소스코드로 돌아가서 이야기를 계속해 보겠습니다. 우리의 소스 코드의 두번째 라인은 다음과 같았습니다.

System.Reflection.Assembly Assem = System.Reflection.Assembly.GetExecutingAssembly();

이 코드는 무엇을 의미하는 것일까요? 이는 .NET 리플렉션이라는 기법을 이용하고 있는 것인데요. 이 코드의 의미는 바로 현재 구동중인 어셈블리 자체를 얻어오는 것입니다. 우리가 사용하고자 하는 리소스 파일이 현재 실행되고 있는 어셈블리에 들어있으므로, 이를 .NET 리플렉션을 이용해서 얻어오는 것이죠. 말은 어려울지 모르지만 코드는 매우 간단합니다.

즉, System.Reflection.Assembly.GetExecutingAssembly() 라는 코드를 이용하시면 현재 실행중이 DLL이나 EXE 어셈블리 자체를 얻어올 수가 있게 됩니다. 왜 이 어셈블리를 얻어오냐구요? 음.... 앞에서 집중을 조금 덜 하셨었군여!!!

ResourceManager 클래스의 생성자가 요구하는 두번째 인자라 뭐라고 했었죠? 바로 사용하려는 리소스 파일이 들어있는 어셈블리라고 했었죠? 그렇습니다. 그렇기 때문에 이렇게 어셈블리를 얻어오는 것입니다. ^^

 

 

참고 : 리플렉션이란?

MSDN을 참고해 보면 말입니다. MSDN에서는 리플렉션을 다음과 같이 설명하고 있습니다.

리플렉션을 사용하여 형식의 인스턴스를 동적으로 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져올 수 있습니다. 그리고 나서 형식의 메서드를 호출하거나 형식의 필드 및 속성에 액세스할 수 있습니다. 리플렉션의 일반적인 용도는 다음과 같습니다.

Assembly를 사용하여 어셈블리를 정의 및 로드하고, 어셈블리 매니페스트에 나열된 모듈을 로드하며, 이 어셈블리에서 형식을 찾아 형식의 인스턴스를 만듭니다.

MethodInfo를 사용하여 메서드의 이름, 반환 형식, 매개 변수, public 또는 private 같은 액세스 한정자, 추상 또는 가상 같은 구현 정보를 검색합니다. Type의 GetMethods 또는 GetMethod 메서드를 사용하여 특정 메서드를 호출합니다.

FieldInfo를 사용하여 필드의 이름, 액세스 한정자, public 또는 private 같은 액세스 한정자, static 같은 구현 정보를 검색하고, 필드 값을 가져오거나 설정합니다.

.... (이후 생략)

* 위의 글은 MSDN(VS.NET 한글 도움말)에서 인용한 것임을 밝힙니다.

 

이제, 필요한 두가지 인자가 모두 준비되었으니 ResourceManager 클래스의 인스턴스를 생성해 보겠습니다. 코드의 3번째 라인이 바로 그 작업을 하고 있죠?

ResourceManager appResourceMgr = new ResourceManager(fullName, Assem);

그렇습니다. 이것으로 모든 준비는 끝난 것입니다. 이제 appResourceMgr 라는 변수명을 이용해서 맘껏 리소스 파일안의 데이터들을 불러올 수가 있게 된 것입니다.

데이터를 불러오기 위해서는 꼴랑~ GetString라는 메서드를 사용해 주시면 됩니다. ^^ 이미지나 이진 데이터를 불러오기 위해서 GetObject라는 메서드도 이용할 수 있긴 합니다만, 현업에서는 주로 문자열 메시지들을 담게 될 것이기에... GetString 만을 기억하고 계셔도 무난합니다 ^^.. 예를 들면, 다음 코드처럼 말이죠

Button1.Text = appResourceMgr.GetString("Msg.Click");

GetString 메서드의 인자로는 불러오고자 하는 메시지의 키 값을 적어주시면 됩니다. 그러면 그에 해당하는 값을 뽑아낼 수 있는 것이죠 ^^;; 쉽지 않습니까?

뭔가 초기 세팅이 복잡해 보일 수도 있는데요. 한번 해보고 나면 한개두 안 복잡합니다.

그리고, 컴포넌트 개발에 익숙하신 분이라면 위의 코드 중 공통적인 부분을 따로 빼서... 별도의 헬퍼 클래스를 만들어서 ResourceManager를 좀 더 사용하기 쉽게 만드실 수도 있겠네요 ^^

Posted by SB패밀리

navigator 객체
속성 appName 브라우저의 이름
appCodeName 브라우저의 코드 이름
appVersion 브라우저의 버전, 플랫폼, 국명
userAgent 브라우저의 User Agent
mimeTypes 브라우저의 mime타입 정보
plugins 브라우저에서 지원하는 플러그인 정보
메소드 javaEnabled( ) 자바를 사용할 수 있는지를 체크

 

Document 객체
속성 alinkColor 링크를 클릭했을 때의 색상
anchors 페이지에 있는 모든 anchor객체들의 배열
bgcolor 페이지의 배경색
cookie 클라이언트 컴퓨터 상에 저장된 문자열
fgcolor 텍스트의 색상
forms 페이지에 있는 모든 입력 양식들의 배열
lastModified 페이지의 마지막 수정 날짜
linkColor 페이지에서 링크를 표시하는 색상
links 페이지에 있는 모든 링크들의 배열
referrer 현재 페이지를 불러들인 문서의 URL
title 페이지의 제목
URL 현재 문서의 URL 주소
vlinkColor 방문한 링크의 색상
applets 페이지에 있는 모든 Java applet객체들의 배열
embeds 페이지에 있는 모든 플러그 인들의 배열
images 페이지에 있는 모든 이미지들의 배열
메소드 open( ) 출력을 위해 문서를 연다.
close( ) 열어둔 문서를 닫는다.
clear( ) 브라우저에서 문서를 지운다.
write( ) 페이지에 문자열을 출력한다.
writeIn( ) 페이지에 문자열을 출력 (줄바꾸기 포함)

 

Date 객체
메소드 getYear( ) 1970년 이후의 연도 (마지막 두 숫자)
getMonth( ) 月, 0(1월)에서 11(12월)까지 반영
getDate( ) 日, 1에서 31까지의 정수
getDay( ) 요일, 0(일요일)에서 6(토요일)까지 반영
getHour( ) 시, 0(밤 12시)에서 23(오후 11시)까지 반영
getMinutes( ) 분, 0에서 59까지 반영
getSeconds( ) 초, 0에서 59까지 반영
getTime( ) 1970년 1월 1일 이후 경과된 시간을 1/1000초 단위로 나타낸 값
getTimezoneOffset( ) 그리니치 표준시간과 그 지역 시간 사이의 차이를 분 단위로 반영
getYear( ) 1970년 이후의 연도설정
setMonth( ) 현재의 月설정
setDate( ) 현재의 日설정
setHours( ) 현재의 時설정
setMinutes( ) 현재의 分설정
setSeconds( ) 현재의 秒설정
setTime( ) 1970년 1월 1일 이후 경과된 시간을 1/1000초 단위로 나타낸 값 설정
parse( ) 날짜 문자열을 분석하여 시간을 1/1000초 단위로 리턴
UTC( ) GMT를 기준으로 1970년 1월 1일 이후 경과된 시간을 1/1000초 단위로 리턴
toGMTString( ) GMT(Greenwich Mean Time) 날짜 리턴
toLocaleString( ) 날짜를 문자열로 변환 (mm/dd/yy hh:mm:ss)
toString( ) 문자열로 변환 (Month,day year hh:mm:ss)

 

History 객체
속성 length history 객체에 저장되어 있는 URL 주소의 수
메소드 back( ) history 객체에 저장된 URL주소 중에서 앞으로 이동
forward( ) history 객체에 저장된 URL 주소 중에서 뒤로 이동
go( ) history 객체에 저장된 URL주소에서 특정 엔트리로 점프

 

Window 객체
속성 defaultStatus 상태 선에 나타나는 문자열의 초기 값
frames 윈도우에 포함되어 있는 프레임들
length 윈도우에 포함된 프레임의 수
name 윈도우의 이름
parent 현재 윈도우를 포함하고 있는 윈도우나 프레임
self 현재 윈도우
status 브라우저의 상태 선에 나타나는 메시지
top 윈도우 계층구조 중 최상단 윈도우
window 자기 자신
document 윈도우에서 보여주는 문서의 정보
location 윈도우에서 보여주는 문서의 URL주소
height 윈도우의 높이
width 윈도우의 너비
locationbar 윈도우의 locationbar를 보여줄지의 여부
menubar 윈도우의 menubar를 보여줄지의 여부
personalbar 윈도우의 personalbar를 보여줄지의 여부
scrollbars 윈도우의 scrollbar를 보여줄지의 여부
statusbar 윈도우의 상태 선을 보여줄지의 여부
toolbar 윈도우의 toolbar를 보여줄지의 여부
tags HTML 문서에 사용된 모든 태그들
classes HTML 문서에 정의된 모든 스타일 시트 클래스들
메소드 alert( ) history 객체에 저장된 URL주소 중에서 앞으로 이동
close( ) 윈도우를 닫는다.
confirm( ) 메시지와 OK, Cancle버튼을 가진 다이얼로그 박스 생성. True, False값을 리턴
open( ) 새로운 윈도우를 연다.
prompt( ) 메시지와 입력필드를 가진 다이얼로그 박스 생성
setTimeout( ) 1/1000초 단위의 시간이 흐른뒤 지정된 함수를 실행한다.
clearTimeout( ) setTimeout 해제

 

Select 객체
속성 length 리스트 박스에 포함된 옵션의 수
name 리스트 박스의 이름
options 옵션 메뉴
selectedIndex 선택된 옵션의 인덱스
메소드 focus( ) 리스트 박스에 focus가 되도록 한다.
blur( ) 리스트 박스에서 focus를 없앤다.

 

Option 객체
속성 defaultSelected 옵션이 처음 선택되어 있는지의 여부
index 각 옵션의 인덱스
prototype 옵션에 특성을 추가한다.
selected 옵션이 현재 선택되어 있는지의 여부
text 옵션에서 보여지는 글씨
value 옵션에 할당되어 있는 값

 

Image객체
속성 border 픽셀 값으로 나타낸 테두리의 두께
complete 이미지가 완전히 load되면 true
height 이미지의 세로 길이
hspace 이미지와 주변 글자간이 가로 여백
lowsrc 임시 이미지의 URL 주소
name 이미지의 이름
prototype 이미지 객체에 특성을 추가
src 이미지 파일의 URL주소
vspace 이미지와 주변 글자간의 세로 여백
width 이미지의 가로 길이

 

Array객체
속성 length 배열의 크기
prototype Array 객체에 새로운 특성을 추가한다.
메소드 join( ) 배열의 각 값을 묶어 하나의 문자열로 만든다.
reverse( ) 배열을 역순으로 만든다.
sort( ) 배열을 정렬시킨다.

 

Location 객체
속성 href 현재 문서의 URL 주소
host URL 주소의 호스트 이름과 포트 번호
hostname URL 주소의 호스트와 도메인
protocol 프로토콜의 종류 (예 - http: )
pathname URL 주소에서 절대 디렉토리
port 서버에서의 포트 번호
hash URL주소의 Anchor
searth URL 주소 중에서 검색된 부분
메소드 reload( ) 현재 브라우저에 나타난 문서를 다시 읽는다.
replace( ) ( )안에 들어있는 URL이 현재 브라우저에 나타난 문서를 대신한다.

 

Link 객체
속성 hash URL 주소의 Anchor
host URL 주소의 호스트 이름과 포트 번호
hostname URL 주소의 호스트와 도메인
href <A>태그에서 href 속성으로 지정한 링크된 URL 주소
pathname URL 주소에서 절대 디렉토리
port 서버에서의 포트 번호
protocol 프로토콜의 종류 (예 - http: )
searth URL 주소 중에서 검색된 부분
target <A>태그에서 TARGET으로 지정된 윈도우나 프레임
Posted by SB패밀리