정규식(유효성 체크)

정규식(유효성 체크)

1. 소스
using System.Text.RegularExpressions;
static void Main(string[] args)
{
        string str = "abcwDW2";
        Regex regex = new System.Text.RegularExpressions.Regex(@"^[0-9a-zA-Z]{1,100}$");

        Boolean ismatch = regex.IsMatch(str);
        if (!ismatch)
        {
            Console.WriteLine("숫자와 영문 소문자,대문자만 입력가능합니다.(글자제한100)");
        }
}

2. 문자열이 숫자 형식인지를 확인하는 함수
public bool IsNumber(string strValue)
{
     if (strValue == null || strValue.Length < 1)
        return false;


     Regex reg = new Regex(@"^(\d)+$");


     return reg.IsMatch(strValue);
}

3.  문자열이 알파벳으로만 구성되어 있는지를 확인하는 함수
 public bool IsAlpabet(string strValue)
 {
     if (strValue == null || strValue.Length < 1)
        return false;



     Regex reg = new Regex(@"^[a-zA-Z]+$");
     return reg.IsMatch(strValue);
 }

4. 시작문자열이 알파벳이고, 알파벳과 숫자로 이루어진 문자열인지 여부 확인하는 함수
  public bool IsAlpaNumber(string strValue)
  {
     if (strValue == null || strValue.Length < 1)
        return false;


     Regex reg = new Regex(@"^[a-zA-Z]+[0-9]*$");
     return reg.IsMatch(strValue);
  }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ASP.NET 2.0의 페이지 생존 주기 및이벤트

ASP.NET 2.0의 페이지 생존 주기 및이벤트




1) IHttpHandler.ProcessRequest 호출
페이지 처리는 ProcessRequest메소드를 호출하면서 시작된다. ProcessRequest메소드안에는 웹 폼 로직이 구현되어 있다.
ProcessRequest메소드는 먼저 초기화를 수행하는데 그 중에는 FrameworkInitialize메소드가 포함되어 있다.
여기서는 몇가지 초기화 작업과 .aspx파일에 선언된 컨트롤 트리를 생성한다.
또한 웹파트의 초기화가 수행되고 IsCallBack, IsPostBack, IsCrossPagePostBack, PreviousPage등의 속성이 사용가능한 상태가 된다.

2) 미리 초기화(PreInit)
ASP.NET 2.0에 추가된 이벤트이다.
OnPreInit메소드가 호촐되면 개인 설정 정보(Profile)이 로딩되고 페이지 테마(Theme)가 있는 경우 초기화된다.
이 이벤트에서는 페이지에 대한 PageTheme와 MasterPage를 동적으로 정의할 수 있는 이벤트로 사용할 수 있다.

3) 초기화(Init)
들어오는 웹 요청의 실행 주기 동안 필요한 설정을 초기화한다. Init 이벤트가 발생되며 Init 이벤트는 OnInit 메소드를 호출한다.
Init 이벤트를 사용하거나, OnInit 메소드를 재정의하여 이 단계를 수행한다.
이 단계는 페이지 개발자가 초기화 작업을 수행하기에 적합한 단계이다.

4) 초기화 완료(InitComplete)
InitComplete이벤트는 페이지 초기화 단계가 끝날 때 호출된다.
이 단계에서는 페이지에 선언된 모든 컨트롤들이 초기화되지만 페이지의 상태는 아직 채워지지 않는다.
따라서 서버 컨트롤에 액세스할 수 있지만 사용자가 반환한 정보는 포함되지 않는다.

5) 컨트롤 상태 로드(LoadControlState)
사용자 지정 서버 컨트롤에서 해당 컨트롤 상태를 복원하는 방법을 지정해야 하는 경우 이 메서드를 재정의한다.
ASP.NET 2.0에서 새로 추가되었다. 이 단계는 IsPostBack속성이 true일 때만 수행된다.
LoadControlState는 이전 요청에서 저장된 컨트롤 상태를 컨트롤로 로딩한다.
Control State는 ASP.NET 2.0에서 새로 등장한 상태 저장 방식이다. 컨트롤 상태는 라운드트립이 되는 동안 컨트롤의 상태 데이터를
보전하는 점에서 ViewState와 비슷하지만 페이지 개발자가 컨트롤 상태를 비활성화할 수 없다는 점이 다르다.

6) 뷰 상태 로드(LoadViewState)
ASP.NET의 서버 컨트롤은 ViewState라는 뷰 상태를 저장하는 속성을 Control 클래스에서 상속 받는다.
원래 웹 페이지는 뷰 상태를 저장하지 않아서 페이지가 전환 되었을 때 이전 페이지에 대한 정보는 유지되지 않고 사라진다.
따라서 뷰 상태를 저장하여 전환된 페이지에 전달하기 위해서는 별도로 처리해야 했지만, ASP.NET의 서버 컨트롤은 ViewState 속성을
사용해서 상태 관리를 쉽게 할 수 있다. ViewState는 System.Web.UI.StateBag 클래스 형태이며, 이름/값 쌍이 저장되어 있는 사전이다.
또한 ASP.NET 페이지 프레임워크에 의해 문자열 변수로 지속되다가, 클라이언트에 보내지고 숨겨진 변수로 다시 돌아온다.
다시 게시하는 동안, 페이지 프레임워크는 숨겨진 변수에 입력된 문자열을 분석하고 각 컨트롤의 ViewState 속성을 채운다.
컨트롤에서 속성 데이터에 전용 필드 대신 ViewState 속성을 사용하는 경우, 클라이언트로 라운드 트립하는 동안 자동으로 지속된다. ViewState를 사용할 때 주의점은 일반적으로 ViewState는 라운드트립 중에 페이지 상의 형식 데이터를 지속시키도록 사용하는 것이
바람직 하고, 암호, 연결 문자열, 파일 경로 등의 정보를 저장하기 위해 ViewState를 사용하는 것은 피해야 한다.
또한, ViewState의 모든 데이터는 클라이언트로 자동 라운드트립되며, 이 라운드트립은 성능 오버헤드에 영향을 미치므로,
ViewState를 신중하게 사용해야 한다.
ASP.NET 서버 컨트롤은 EnableViewState라는 속성을 Control에서 받는다. 이 속성을 사용하여 ViewState의 지속성을 설정하거나 해제한다.
ASP.NET 2.0에서는 ControlState가 추가되어서 중요한 컨트롤의 데이터를 해제할 수 없도록 변경되었다.
ControlState는 ViewState와는 달리 개발자가 사용여부를 셋팅할 수 없도록 추가되었다.
컨트롤내의 반드시 유지되야 하는 값들은 ControlState를 통해 사용하도록 한다.

7) 게시 데이터 로드(LoadPostData)
이 이벤트는 IsPostBack속성이 true일 때만 실행된다. 앞의 두 과정에 의해서 이전 요청 때 가지고 있던 페이지 상태가 복구되었다.
이 이벤트에서 실행하는 처리는 클라이언트에서 수정된 데이타를 컨트롤에 적용하는 것이다. 예를 들면 사용자가 TextBox의 입력창에
“bbb”란 데이터를 입력하고 포스트백을 했다면 앞의 두 이벤트(LoadControlState, LoadViewState)를 거치면서 Text속성은 “aaa”란
원래값으로 설정된다. 그러나 이 값은 클라이언트에서 사용자가 입력한 “bbb”란 값으로 변경되어야 한다.
이 이벤트에서는 사용자가 수정한 데이터를 해당 컨트롤로 전달해 주는 처리를 한다.

8) 미리 로드(PreLoad)
이 이벤트는 Load이벤트에 앞서 페이지나 컨트롤을 처리해야 하는 경우에 사용한다. 페이지에서 이 이벤트가 발생한 후에 해당 페이지와
모든 컨트롤에 대한 뷰 상태를 로딩하고 Request에 포함된 모든 포스트백된 데이터를 처리한다.

9) 로드(Load)
데이터베이스 쿼리 설정 등과 같이 모든 요청에 공통적으로 사용되는 작업을 수행한다.
서버 컨트롤들의 트리가 구현/초기화 되며, 상태가 복원되고, 폼 컨트롤은 클라이언트측 데이터를 반영한다.
Load 이벤트가 발생되어 OnLoad 메소드를 호출한다. Load 이벤트를 사용하여 이 단계에서의 작업을 수행할 수 있다.
Load이벤트는 모든 자식 컨트롤에도 연속적으로 발생한다.
이벤트가 발생하는 순서는 부모 컨트롤에서 자식 순으로 내려가기 때문에 페이지 객체의 Load이벤트가 가장 먼저 호출된다.

10) 게시 변경 알림 보내기(RaiseChangedEvent)
이 단계에서는 현재 및 이전 게시 간의 상태 변경에 응답하여 변경 이벤트가 발생한다. 게시 데이터 처리 단계와 마찬가지로
게시 변경 이벤트를 발생시키는 컨트롤만 이 단계를 수행한다.
IPostBackDataHandler인턴페이스를 구현한 컨트롤들은 RaisePostDataChangedEvent를 호출한다.
특정 컨트롤의 데이터가 클라이언트에 의하여 변경되었을 경우 해당 컨트롤의 RaisePostDataChangedEvent를 호출해서 데이터가
변경되었음을 알린다. 예를 들면 TextBox컨트롤은 클라이언트에서 새로운 값이 입력되면 TextChanged이벤트를 발생시킨다.

11) 게시 이벤트 처리(RaisePostbackEvent)
클라이언트에서 포스트백을 일으킨 컨트롤에 대해 서버측 이벤트를 발생시킨다.
포스트백 이벤트를 처리하는 컨트롤은 IPostBackEventHandler인터페이스를 구현해야 한다.
이 인터페이스는 단 하나의 메소드인 RaisePostBackEvent를 포함하는데 포스트백이 발생하면 클라이언트에서 포스트백을 일으킨 컨트롤의
RaisePostBackEvent메소드를 호출한다.
RaisePostBackEvent인터페이스를 구현하는 대표적인 컨트롤은 Button인데 RaisePostBackEvent메소드가 호출되면
Click이나 OnCommand이벤트를 일으킨다.
이 과정에서 일어나는 또 하나의 중요한 처리는 클라이언트에서 전송된 데이터에 대한 유효성 검사이다.

12) 로드 완료(LoadComplete)
LoadComplete이벤트는 모든 포스트백된 데이터와 ViewState 데이터가 페이지와 페이지의 모든 컨트롤에 로딩된 후에 발생한다.
동적으로 추가되는 컨트롤에서 뷰 상태가 제대로 작동하려면 페이지 주기의 사전 렌더링 단계 또는 그 이전에 컨트롤을 추가해야 한다. ASP.NET 2.0에서 추가되었다.

13) 사전 렌더링(PreRender)
출력을 렌더링하기 전에 업데이트를 수행한다.
렌더링 단계의 변경 내용은 손실 되지만, 사전 렌더링 단계의 컨트롤 상태 변경 내용은 저장할 수 있다.

14) 사전 렌더링 완료(PreRenderComplete)
PreRenderComplete이벤트는 페이지 주기의 사전 렌더링 단계가 완료될 때 발생한다.
페이지 주기의 이 단계에서는 모든 컨트롤이 만들어지고 필요한 페이지 매김이 완료되어 페이지가 출력 스트림으로 렌더링될 준비를 한다.

15) 컨트롤 상태 저장(SaveControlState)
컨트롤의 기존 상태 데이터를 저장한다. 웹페이지가 서버에 다시 게시된 후에 발생하는 컨트롤 상태의 변경내용을 저장한다.
페이지에 포함된 모든 컨트롤의 SaveControlState메소드가 연속적으로 호출된다.
각 컨트롤의 SaveControlState메소드는 저장할 컨트롤 상태를 반환하는데 이 값들은 하나의 컬렉션 안으로 수집된다.

16) 뷰 상태 저장(SaveViewState)
컨트롤의 ViewState 속성은 이 단계가 수행되면 문자열 객체에 자동으로 유지된다.
이 문자열 객체는 클라이언트에 보내지고 숨겨진 변수로 다시 반환 된다.

17) 상태 저장 완료(SaveStateComplete)
페이지와 페이지에 있는 컨트롤에 대한 모든 ViewState와 ControlState정보가 저장된 후에 이 이벤트가 발생한다.

18) 렌더링(Render)
클라이언트로 렌더링 할 출력을 생성한다. 렌더링이란 디스플레이 표면에 시각적으로 표시하는 프로세스를 말한다.
웹 요청의 경우, 실제 렌더링은 클라이언트의 웹 브라우저 등에서 수행된다. ASP.NET 런타임은 웹 요청에 반응하여 HTML을 보내야 하고,
페이지 및 자식 컨트롤은 태그 컨텐트를 출력 스트림에 기록해야 한다.

19) 삭제(Dispose)
컨트롤을 삭제하기 전에 최종 정리를 수행한다. 데이터베이스 연결에 대한 참조나 파일 참조 등이 유지된다면, 이 단계에서 해제해야 한다.

20)  언로드(Unload)
컨트롤을 삭제하기 전에 최종 정리를 수행한다. Dispose에서 정리를 수행했다면, 이 단계는 처리하지 않는다.
UnLoad 이벤트를 사용하여 이 단계의 작업을 수행할 수 있다.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CSS 기능 정리

CSS 기능 정리

[ direction ] 문단에 대한 서식 방향을 설정 합니다.
[ margin ] object의 여백을 설정 합니다. top, right, bottom, left 순서로 여백이 적용 되며 모든 …
[ padding-bottom ] 스타일이 적용된 곳의 하단 경계선으로 부터 안쪽의 내용의 하단 사이에 공간을 …
[ ruby-align ] 문장에 보이는 주석 형식의 RT를 사용 할때 RT안에 정렬 위치를 설정 합니다.
[ border-top-color ] 테두리 상단(top)에 색상을 넣습니다.
[ text-indent ] 문단의 첫 줄이 들여쓰기 됩니다. (값은 들여쓰기 되는 길이)
[ margin-left ] object 또는 문단 경계로 부터 왼쪽 여백을 설정 합니다.
[ padding-right ] 스타일이 적용된 곳의 오른쪽 경계선으로 부터 안쪽의 내용의 오른쪽 사이에 공간…
[ background ] 배경에 대한 세부 설정을 한번에 작업 할 수 있습니다.
[ background-color ] 문서나 object에 배경색을 적용 합니다.
[ layout-grid-mode ] char과 line에 대하여 적용될 객체를 설정 합니다.
[ layout-grid-type ] 텍스트 layout에 대하여 grid될 타입을 설정 합니다.
[ margin-right ] object 또는 문단 경계로 부터 오른쪽 여백을 설정 합니다.
[ padding-top ] 스타일이 적용된 곳의 상단 경계선으로 부터 안쪽의 내용의 상단 사이에 공간을 적…
[ border-left-width ] 테두리(left)의 넓이를 적용 합니다.
[ background-Image ] object에 배경 이미지를 설정 합니다.
[ layout-grid ] layout-grid의 세부 속성들을 한번에 설정 할 수 있으며, 텍스트에 layout을 설정 …
[ padding-left ] 스타일이 적용된 곳의 왼쪽 경계선으로 부터 안쪽의 내용의 왼쪽 사이에 공간을 적…
[ letter-spacing ] 객체의 텍스트간 간격을 설정 합니다. (보통 글자수에 해당하는 "em" 사용)
[ ruby-position ] 문장에 보이는 주석 형식의 RT를 사용 할때 위치를 설정 합니다.
[ font ] font에 관한 모든 속성을 한번에 설정 할 수 있습니다. 또한 시스템 관련 글꼴을 적용 할 …
[ list-style ] 목록 스타일에 관한 모든 설정을 한번에 할 수 있습니다.
[ background-position ] 배경 이미지를 사용 했을때 배경 이미지의 시작점이나 위치를 설정 합니다.
[ layout-grid-char ] layout에 대하여 넓이를 설정 합니다.
[ list-style-type ] 목록 머리표에 기호, 숫자, 로마숫자, 알파벳을 사용 합니다.
[ word-spacing ] 단어간의 간격을 설정 합니다.
[ border-top-style ] 테두리 상단(top)에 스타일을 지정 합니다.
[ list-style-position ] 목록 내에서 줄바꿈 될경우, 다음 줄의 시작점을 설정 합니다.
[ padding ] 스타일이 적용된 안쪽으로 공간을 만듭니다. 안쪽의 다른 객체의 가장 자리로 부터 경계…
[ ime-mode ] 입력 할 수 있는 곳에 대해서 IME를 설정 합니다. (IME 우리는 대부분 대한민국 이겠죠…
[ vertical-align ] 수직 정렬을 설정 합니다.
[ list-style-image ] 목록 머리표에 이미지를 사용 합니다.
[ white-space ] 공백을 그대로 처리하거나 줄바꿈에 대한 설정을 합니다. (PRE, NOBR)
[ border-right-width ] 테두리(right)의 넓이를 적용 합니다.
[ border-bottom-color ] 테두리 하단(bottom)에 색상을 넣습니다.
[ text-overflow ] overflow를 적용한 상태에서 text-overflow를 사용 (텍스트 자체에 위치를 지정 …
[ margin-bottom ] object 또는 문단 경계로 부터 아래쪽 여백을 설정 합니다.
[ border-left ] 테두리에 관한 설정들을 left 부분에 적용 합니다.
[ border-left-style ] 테두리 왼쪽(left)에 스타일을 지정 합니다.
[ border-collapse ] 표(TABLE)에 셀을 주거나 주지 않습니다.
[ border-right-style ] 테두리 오른쪽(right)에 스타일을 지정 합니다.
[ border-left ] 테두리에 관한 설정들을 left 부분에 적용 합니다.
[ border-left-color ] 테두리 왼쪽(left)에 색상을 넣습니다.
[ font-family ] 글꼴체를 설정 합니다. 여러개 사용 가능 하며 구분자(,)를 사용 하며 우선 순위를 …
[ border-right-color ] 테두리 오른쪽(right)에 색상을 넣습니다.
[ font-variant ] 폰트에 대해서 작은 대문자로 적용 됩니다.
[ text-align ] 객체 안에 텍스트의 정렬 상태를 설정 합니다.
[ border-bottom-width ] 테두리(bottom)의 넓이를 적용 합니다.
[ border-top-width ] 테두리(top)의 넓이를 적용 합니다.
[ border-bottom-style ] 테두리 하단(bottom)에 스타일을 지정 합니다.
[ font-size ] 글꼴에 크기를 설정 합니다.
[ border-bottom ] 테두리에 관한 설정들을 bottom 부분에 적용 합니다.
[ color ] 스타일이 적용된 객체내 텍스트에 색상을 설정 합니다.
[ text-decoration ] 텍스트에 밑줄, 윗줄, 가운데 줄, 깜박이 효과등 장식을 합니다.(BLINK 넷츠케…
[ background-repeat ] 배경 이미지의 반복 여부와 방향에 따른 배열을 적용 합니다.
[ border-style ] 테두리의 스타일을 지정 합니다.
[ border-width ] 테두리(top, right, bottom, left)의 넓이를 적용 합니다.
[ text-transform ] 객체 내의 영문자에 대하여 소문자, 대문자, 또는 단어의 첫글자만 대문자로 설…
[ layout-grid-line ] layout에 대하여 높이를 설정 합니다.
[ writing-mode ] 텍스트의 방향을 설정 합니다.
[ border-color ] 테두리에 색상을 넣습니다.
[ font-weight ] 폰트에 대해서 굵기를 적용 합니다.
[ background-attachment ] 배경 이미지를 문서나 object에 사용 했을때 내용이 길어서 스크롤될때 …
[ display ] 스타일을 적용한 객체에 인라인 또는 블럭단위의 박스를 생성 합니다.
[ border ] 객체 주위에 테두리를 만듭니다.
[ border-right ] 테두리에 관한 설정들을 right 부분에 적용 합니다.
[ font-style ] 폰트에 대해서 기울임 효과를 적용 합니다.
[ border-top ] 테두리에 관한 설정들을 top 부분에 적용 합니다.
[ bottom ] Position의 값에 따라서 브라우저나 상위 문단을 기준으로 바닥으로 부터의 위쪽 거리(문…
[ left ] Position의 값에 따라서 브라우저나 상위 문단을 기준으로 왼쪽 에서의 거리(문서내 기준)
[ word-wrap ] 정해진 영역을 내용이 초과시 줄바꿈의 상태를 설정 합니다.
[ right ] Position의 값에 따라서 브라우저나 상위 문단을 기준으로 오른쪽에서의 거리(문서내 기준…
[ overflow ] width 속성이나 height 속성에 의해서 내용에 따라 화면의 크기를 제어 합니다.
[ line-height ] 텍스를 사용 하는데 있어서 줄사이(행간) 간격을 설정 합니다.
[ top ] Position의 값에 따라서 브라우저 또는 상위 문단과 top이 쓰인 객체와의 거리(문서내 기준)
[ height ] 문단이나 이미지의 높이를 설정 합니다.
[ width ] 문단이나 이미지의 너비를 설정 합니다.
[ clip ] object의 일부만 보이게 하고 나머지는 잘라내어 보이지 않습니다.
[ z-index ] Netscape의 <LAYER>와 같은 개념이며, 위치에 따라 중첩된 결과를 보일 수 있고 po…
사용자의 윈도우색상 사용하기
[ position ] 객체의 위치를 화면에 설정 합니다.
[ scrollbar-3dlight-color ] 스크롤바의 스클롤 박스와 화살표 박스의 상단과 왼쪽 가장 자리에 색…
[ overflow-y ] height 속성 의해서 내용에 따라 화면의 높이를 제어 합니다.(세로 Y축 기준: 가로 …
[ :active ] <A> 태그의 링크 상태에 대한 스타일을 적용 합니다. (링크를 클릭 하는 순간)
[ scrollbar-base-color ] 스크롤바의 arrow, shadow, darkshadow를 제외한 기본적인 곳에 적용 됩니…
[ visibility ] 객체를 보이지 않게 할때 사용 합니다.
[ :hover ] 링크걸린 곳에 마우스를 올리는 순간
CSS3 Previews
[ scrollbar-track-color ] 스크롤바의 트랙에 적용 합니다.
[ :visited ] <A> 태그의 링크 상태에 대한 스타일을 적용 합니다. (이미 방문한 곳의 링크)
[ scrollbar-highlight-color ] 스크롤바의 스클롤 박스와 화살표 박스의 상단과 왼쪽 가장 자리의 …
[ table-layout ] 테이블(표)의 테이블 셀(cell), 줄(row), 컬럼(column)들의 배치에 사용되는 기능…
[ :first-line ] 문단 시작 첫 줄에 스타일을 적용 합니다.
[ clear ] float과는 반대 개념의 속성이며 좌측이나, 우측, 또는 양쪽 모두에 다른 문단이 오지 않…
[ scrollbar-darkshadow-color ] 스크롤바의 스클롤 박스와 화살표 박스의 하단과 오른쪽 가장 자리…
[ scrollbar-shadow-color ] 스크롤바의 스클롤 박스와 화살표 박스의 하단과 오른쪽의 그림자 부분…
[ scrollbar-face-color ] 스크롤바의 스클롤 박스와 화살표 박스 그리고 트랙의 표면에만 적용 됩니…
[ scrollbar-arrow-color ] 스크롤바의 화살표 박스의 화살표에 색상을 적용 합니다.
[ page-break-before ] [page-break-after] 인쇄할 페이지 분할
[ min-height ] table-layout에 fixed 되어 있어도 높이만큼 자르지 않고 높이를 설정 할 수 있습니…
[ float ] 보통 이미지에 사용 하는데 이미지 태그 정렬에 관한 속성중 left와 right와 같은 비슷한 …
[ :link ] <A> 태그의 링크 상태에 대한 스타일을 적용 합니다. (가본적이 없는 곳의 링크)
웹표준에 관한 타입 선언
양식과 관련있는 태그 <BUTTON> <FIELDSET> <FORM> <INPUT> <LABLE> &…
[ :first-letter ] 문단 시작 첫 머리글에 스타일을 적용 합니다.
[ overflow-x ] width 속성 의해서 내용에 따라 화면의 너비를 제어 합니다.(가로 X축 기준: 세로 스…
[ cursor ] 마우스 포인터의 모양을 설정 합니다.
[Filter] - 문자나 이미지를 대상으로 색상을 반전시키고 또는 뒤집고,투명하게하고,흐리게
[ zoom ] 객체의 크기를 확대/축소 합니다. (줌 효과)
속성 전체 리스트
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
간단한 DB연결 예제

간단한 DB연결 예제

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ///////////////////////////////////////////////////             Web.config 설정부분 //////////////////////////////////////////////////////////////////
            ////<connectionStrings>
            ////    <add name="TestConnectionString" connectionString="Data Source=.;Initial Catalog=Test;User ID=sa;Password=sa"
            ////        providerName="System.Data.SqlClient" />
            ////</connectionStrings>
            ///////////////////////////////////////////////////             Web.config 설정부분 //////////////////////////////////////////////////////////////////
         
            // SqlConnection 개체 생성
            SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString);

            // SqlCommand 개체 생성
            string strSql = "SELECT * From Member";
            SqlCommand cmd = new SqlCommand(strSql, con);

            // SqlDataReader 개체 생성
            con.Open(); // Connection 개체 열기
            SqlDataReader rd = cmd.ExecuteReader();

            // SqlDataReader 개체를 GridView 컨트롤에 바인딩
            GridView1.DataSource = rd;
            GridView1.DataBind();

            // SqlDataReader 개체 및 SqlConnection 개체 닫기
            rd.Close();
            con.Close();  
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>제목 없음</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h3>연결기반 SELECT 예제</h3>
     
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
    </div>
    </form>
</body>
</html>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MasterPage

MasterPage

1. 마스터 페이지 안에서 컨트롤러 찾기.
this.Master.FindControl("패널").FindControl("컨트롤")...
마스터 페이지를 사용하였기에 경로상 ContentPlaceHolder단에서 this에서 바로 찾아지지 않는다 ->상위 마스터페이지를 찾은후, 다시 컨텐츠를 찾는다
ex) Repeater List_Product = (Repeater)Page.Master.FindControl("cph").FindControl(partTmp)

--------------------------------------------------------------------------------------------------------------------------
2, MasterPage 의 속성(Properties) 다루기
MasterPage 에 public method 를 생성한다.
예로,

public String Name
{
     get {return TextBox1.Text;}
     set {TextBox1.Text = value;}  
}

이 public method 를 ContentPage 에서 읽게 하려면 ContentPage 에 @MasterType 선언을 해주어야 한다.
   1:  <%@ MasterType virtualPath="~/MasterPage.master" %>이렇게 선언을 한 뒤에 ContentPage 의 코드 View 에서 Master Class 를 사용하여 객체에 접근할 수 있다.

protected void Button1_Click(object Sender, EventArgs e)  \
{  
     TextBox2.Text = Master.Name;   
}
속성은 이렇게 다루어지는 반면에,
Control 은 Master Class 의 FindControl 로 접근이 가능하다. 코드 예제로 쉽게 설명이 가능하다.

Label _Brand = (Label)Master.FindControl("Brand");   
_Brand.Text = "This text is from Content Page";
"Brand"라는 아이디의 Control 을 Master Page 에서 찾은 후에 새로운 Label 객체에 할당해 주었다. 그런 후에 속성들을 다룰 수 있게 된다.

--------------------------------------------------------------------------------------------------------------------------
3. MasterPage와 ContentPage 간 접근

*.master에 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 하나 박아두고...
당연히 <asp:ContentPlaceHolder> 박아둬야겠지???

*.aspx 페이지에서....... 버튼 넣어두고... 클릭 이벤트 처리....

protected void Button1_Click(Object sender, EventArgs e)

{
   //MasterPage의 TextBox1이라는 아이디를 갖는 박스를 가져와
   TextBox txt = (TextBox)Master.FindControl("TextBox1");

   // 가져온 박스의 문자열을 컨텐츠페이지의 Label1 에다가 뿌려준다는 내용
   Label1.Text = txt.Text;
}
반대의 경우는....
ContentPlaceHolder1.FindControl()을 쓰면 되더라구...

--------------------------------------------------------------------------------------------------------------------------
4. MasterPage, Page, UserControl 간 접근 방법 
Asp.Net2.0 레이아웃은 마스터 페이지에 UserControl 과 ContentPlaceHolder 를 둔다.
1. UserControl 에서 Page 컨트롤에 접근하기
ContentPlaceHolder cph = (ContentPlaceHolder)Parent.FindControl("ContentPlaceHolder1");
HtmlInputText pageText = (HtmlIn.putText)cph.FindControl("TextBox1");
pageText.Value = "UserControl=>Page Test";

2. Page 에서 UserControl  컨트롤 접근하기
UserControl Left = (UserControl)Master.FindControl("Left1");
HtmlInputText userControlText = (HtmlInputText)Left.FindControl("TextBox1");
userControlText.Value = "Page=>UserControl Test";

- 속성 접근
UserControls.Left Leftcontrol = (UserControls.Left)Left;
Left2.LoginChk = "aaa";

3. MasterPage 에서 Page 컨틀롤 접근하기
HtmlInputText pageText = (HtmlInputText)MainContent.FindControl("TextBox1");

pageText.Value = "Master=>Pge Test";

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



Request

Request

Request 객체
웹브라우저에서 사용자에 의해 정보를 전달받아 올 때 사용하는 객체

1. QueryString 컬렉션
Request.QueryString("변수")
HTTP 쿼리 스트링에 포함된 변수의 값을 얻어 오는 컬렉션입니다. '쿼리 스트링이 뭐지?'하시는 분이 계실텐데. 쿼리 스트링이라는 말은 질의 문자열을 의미하는데 보통 하이퍼링크로 보낼 때 뒤에 물음표(?)를 붙이고 각 변수마다 엠퍼센드(&)로 구분하게 되어있습니다.
위의 예제의 <a href = "Check.asp?asp=90%25">90%</a>에서 '?'뒤에 변수가 오고 '=' 다음에 오는 것이 그 변수의 쿼리 스트링 값이 되는 것입니다. 이러한 하이퍼링크의 형태로 보내지는 방식을 GET 방식이라고 합니다. QueryString 컬렉션은 GET 방식으로 서버로 보내진 데이터를 받아오는 역할을 합니다.

2. Form
Request.Form("변수")
GET 방식과는 달리 전달되는 데이터가 인코딩되어 서버로 보내지는 것을 POST 방식이라고 합니다. 이러한 POST 방식을 사용하는 데이터를 받아오는 컬렉션입니다.
※Request.QueryString("변수")이나 Request.Form("변수") Request("변수")와 같이 생략하셔도 무방합니다.

3. Cookies 컬렉션
Request.Cookies("변수")
쿠키라고 들어 보셨나요? 뭐라구요? 먹는 거라구요. 하하. 물론, 먹는 과자이름도 쿠키가 있죠. QueryString이나 Form 컬렉션은 하나의 브라우저의 요청에만 사용가능하고, 값이 계속 바뀌는 반면에 쿠키는 지속적으로 데이터를 저장할 수 있습니다. 특히 쿠키는 기본적으로 서버가 아닌 클라이언트에 저장됩니다. 이러한 쿠키의 여러 가지 사용법은 좀 있다가 다음의 Response 객체에서 살펴볼께요.

4. ServerVariable 컬렉션
Request.ServerVariable("변수")
ServerVariable 컬렉션은 참 유용한 일을 하지요. 많은 환경변수들이 있지만, 자주 쓰는 것만 보면 <4>와 같습니다.
< 4> ServerVariable 컬렉션의 자주 쓰이는 환경변수
환경변수
설명
REMOTE_ADDR
클라이언트 호스트의 IP주소
REMOTE_HOST
클라이언트 호스트의 이름
SERVER_NAME
서버의 IP 또는 도메인 이름
HTTP_USER_AGENT
사용자의 브라우저 종류

상대방의 IP 주소와 호스트 이름을 출력하는 예제입니다.
당신의 IP <%=Request.ServerVariable("REMOTE_ADDR")%>입니다.<BR>
당신의 Host Name <%=Request.ServerVariable("REMOTE_HOST")%>입니다.
보통 익스플로어와 넷스케이프는 클라이언트 스크립트에 따라 잘 동작할 수도 있고 그렇지 않을 수도 있습니다. 그래서 브라우저의 종류에 따라서 웹페이지를 달리 생성할 때도 있습니다. 다음 예제는 ServerVariable를 이용해서 브라우저 타입을 알아오는 방법입니다.
<%If InStr(Request.ServerVariables("HTTP_USER_AGENT"), "MSIE") Then%>
MS Explore입니다.
<%ElseIf InStr(Request.ServerVariables("HTTP_USER_AGENT"), "Nav") Then%>
Netscape입니다.
<%End If%>
다음과 같이 ServerVariable 컬렉션을 사용하지 않고, 자바스크립트를 써서 할 수도 있습니다. 되도록 자바스크립트와 같은 클라이언트 사이트 스크립트를 쓰는 것이 서버에 부하를 줄일 수 있다고 합니다. 그래서, 꼭 필요하지 않으면 서버의 자원을 낭비하지 않고 클라이언트 사이드 스크립트를 쓰는 것이 효율적입니다.
<script LANGUAGE="JavaScript">
var ver = navigator.appVersion;
if (ver.indexOf("MSIE") != -1)
window.location.href="http://www.asp.co.kr/Explore.html"
else if(navigator.userAgent.indexOf("Mozilla/3.0") != -1)
window.location.href="http://www.asp.co.kr/Netscape3html"
else if(navigator.userAgent.indexOf("Mozilla/4.0") != -1)
window.location.href="http://www.asp.co.kr/Netscape4.html"
</script>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

DataRow[]  -> DataTable  만들기

DataRow[] -> DataTable 만들기

Select() 이용하여 추출된 DataRow[] 을 DataTable 로 만들기

    DataRow[] dr_ChartSource = dt_GridSource.Select("[구분] = '합계'");
    DataTable dt_ChartSource = new DataTable();
    dt_ChartSource = dt_GridSource.Clone();

    foreach ( DataRow dr in dr_ChartSource )
    {
         DataRow tr = dt_ChartSource.NewRow();
         for ( int j = 0 ; j <  dr.Table.Columns.Count ; j ++ )
         {
             tr[j] =  dr[j];
         }
        dt_ChartSource.Rows.Add(tr);
    }
 또는
    DataRow[] dr_ChartSource = dt_GridSource.Select("[구분] = '합계'");
    DataTable dt_ChartSource = new DataTable();
    dt_ChartSource = dt_GridSource.Clone();
    foreach ( DataRow dr in dr_ChartSource )
    {
         DataRow tr = dt_ChartSource.NewRow();
         tr.ItemArray = dr.ItemArray;
        dt_ChartSource.Rows.Add(tr);
    }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
속성 정의 방법

속성 정의 방법

namespace Ex16
{
    class Person
    {
        // 멤버 변수 선언
        private string _name; // 이름
        private string _nationality; // 국적
        private int _age; // 나이

        // 생성자 정의
        public Person() { }

        public Person(string name, string nationality, int age)
        {
            _name = name;
            _nationality = nationality;
            _age = age;
        }

        // 속성(property) 정의
        public string Name
        {
            get { return _name; }          
        }

        public string Nationality
        {
            get{ return _nationality; }
            set{ _nationality = value; }
        }

        public int Age
        {
            get { return _age; }
            set
            {
                if (value >= 0)              
                    _age = value;              
            }
        }

        // 멤버 메서드 정의
        public void ShowInfo()
        {
            Console.WriteLine("name: {0}", _name);
            Console.WriteLine("nationality: {0}", _nationality);
            Console.WriteLine("age: {0}", _age);
        }
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
서비스가 실행되고 있지 않으므로 Windows Update에서 현재 업데이트를 확인할 수 없습니다

서비스가 실행되고 있지 않으므로 Windows Update에서 현재 업데이트를 확인할 수 없습니다

 제어판에 있는 Windows Update가 안될 때 해결법

1. 내 컴퓨터에서 마우스 오른쪽 버튼을 눌러 관리에 들어간다.
2. 서비스 및 응용프로그램의 서비스에 들어간다.
3. Windows Update 라는 항목을 찾아서 중지시킨다. (창은 닫지마세요 이따 또 써야함)
4. C:\Windows\SoftwareDistribution 폴더를 찾는다.
5. SoftwareDistribution 폴더 이름을 다르게 변경한다. (예:SoftwareDistribution-2)
6. 아까 3번 항목에서 중지시켰던 서비스를 다시 실행시킨다.
7. 제어판의 Windows Update 가보면 실행이 된다.  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
자동가입방지번호 구현

자동가입방지번호 구현

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;

using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;



namespace Home.Inc.RamdomImages.DoubleOnline
{
    public partial class ComfirmBitmapHandler1 : Web.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.ContentType = "image/jpeg";                            // 보내는 형식을 "image/jpeg"형태라고 지정해준다
            // 이미지 사이즈
            int lenX = 85, lenY = 20;
            Bitmap bm = new Bitmap(lenX, lenY);
            Graphics g = Graphics.FromImage(bm);
            // 배경으로 그라데이션 처리
            LinearGradientBrush bgGr = new LinearGradientBrush(
            new Point(0, 0),
            new Point(lenX, lenY),
            Color.Blue,
            Color.Black);
            g.FillRectangle(bgGr, 0, 0, lenX, lenY);  //배경적용

            // 5자리 숫자의 난수를 발생하여 텍스트를 만든다          
            string text = string.Empty;
            Random rnd = new Random();
            for (int i = 0; i < 5; i++)
            {
                text += rnd.Next(9).ToString();
            }
            // 텍스트를 그린다.
            Brush textBrush = new SolidBrush(Color.White);
            g.DrawString(text, new Font("굴림", 14), textBrush, 9, 0, StringFormat.GenericDefault);
            // 스트림에 비트맵을 쓴다.
            bm.Save(Response.OutputStream, ImageFormat.Jpeg);

            // 세션 생성후 5자리 숫자를 세션에 담는다.
            //SystemX.Web.SessionState.HttpSessionState session = (SystemX.Web.SessionState.HttpSessionState)HttpContext.Current.Items["ASP.NET_SESSIONSTATE"];   // 추가된 세션을 사용선언
            Session["ValidateString"] = text;
        }
    }
}


//-> 사용 <img runat="server" id="imgRm" alt="" src='../../Inc/RamdomImages/DoubleOnline/ComfirmBitmapHandler.aspx' />
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
페이지 라우팅(수정)

페이지 라우팅(수정)


제가 좋아하는 MVP 중에 '정성태'씨가 있습니다. (http://www.sysnet.pe.kr/)

정성태씨 블로그에는 닷넷 관련 좋은 팁과 자료가 있어 자주 방문하는데요.

그런데 포스트글을 볼 때 아래와 같은 주소창으로 접근이 됩니다.

 http://www.sysnet.pe.kr/2/0/1404    (Hyper-V VM 복사는 robocopy 로.)

분명 GET방식도 아니고 xxx.aspx같은 페이지 접근도 아닌데 접근이 가능하더군요.

그래서 찾아 봤습니다.

Webform Routing이란 건데요. 특정 URL맵핑값을 웹어플리케이션이 시작할 때 등록시키는 방법입니다.

ASP.NET MVC에서는 프로젝트 생성 시 자동으로 Webform Routing을 해주는 부분이 포함되어 있습니다.

 

 하지만 ASP.NET 웹폼 프로젝트에는 없기 때문에 직접 만들어 줘야 합니다.

1. 프로젝트에서 우클릭 -> 추가(D) -> 새 항목(W)...
 

2. 설치된 템플릿 / Visual C# -> 웹 -> 전역 응용 프로그램 클래스 선택 -> 이름 Global.asax ( 기본값입니다. 보통 이름을 Global을 사용하니 그대로 사용합니다.) 참고로 전역 응용 프로그램 클래스는 프로젝트당 1개만 만들 수 있습니다.
 

3. 다시 2.번 화면으로 가서 이름을 test1로 웹 폼을 추가 시킵니다.
 

4. 자 그러면 Global.asax파일과 test1.aspx 파일이 생겼습니다. Global.aspx.cs(코드비하인드파일) 파일을 열어 아래와 같이 작성합니다.
첫 번째 매개변수는 라우팅 맵의 이름(유일한값)이고 두 번째는 URL 요청 형식입니다. 세 번째 인자는 라우팅 할 실제 페이지입니다. 반드시 가상경로만 가능합니다.
아래의 코드를 해석하면 다음과 같습니다. 주소/Contact/Details/krinlion으로 접속(요청)하면 test1페이지로 id=krinlion으로 전달 하겠다.
이제 주소창에 http://주소/Contacts/Details/krinlion 이라고 입력하면 라우팅 테이블에 의해 test1.aspx로 이동하게 됩니다.
 protected void Application_Start(object sender, EventArgs e) // 웹 어플리케이션이 시작할 때 실행되는 이벤트 처리기
  {
   RegisterRoutes(RouteTable.Routes);
  }

  void RegisterRoutes(RouteCollection routes) // 라우터 테이블을 추가/관리하는 메서드
  {
   routes.MapPageRoute(
     "Contact_Details",                  // Route Name
     "Contacts/Details/{id}",         // Url and Parameters
     "~/test1.aspx"                      // Page Handling Request
     );
  }

TIP) MSDN 도움말
라우터 테이블에서 해당 요청URL와 같은 형태의 경로를 찾아내면 나머지 경로에 대해서는 확인 하지 않기 때문에 같은 형식의 경로+파라미터를 라이터 테이블에 추가한다면 순서에 유의해야 한다.
  ASP.NET 응용 프로그램이 요청을 처리할 때 응용 프로그램은 Routes 속성의 경로 컬렉션을 반복하여 URL 요청 형식과 일치하는 경로를 찾아냅니다.응용 프로그램은 URL과 일치하는 컬렉션에서의 첫 번째 경로를 사용하므로 Routes 속성에 추가하는 경로의 순서가 중요합니다.

5. 이제 주소창에 Contacts/Details/krinlion으로 했을 때 test1.aspx로 라우팅이 잘 되는지와 test1.aspx 페이지로 값이 잘 전달되는지를 확인해야겠네요.
전달받은 인자를 확인 하기 위해 test1.aspx.cs(코드비하인드파일)에 아래와 같이 전달받은 인자를 출력하는 코드를 넣습니다.
라이팅에 의해 전달된 파라미터는 POST/GET 방식으로 전달 된 값이 아니기 때문에
this.Request.Form["id"] or this.Page.Request["id"]로 값을 가져올 수 없습니다. 그래서 아래와 같이 this.Page.RouteData.Values["id"].ToString()를 사용하여 값을 가져와 처리 합니다.
 public partial class test1 : System.Web.UI.Page
 {
      protected void Page_Load(object sender, EventArgs e)
      {
           Response.Write(String.Format("전달 된 값은 : {0} 입니다.", this.Page.RouteData.Values["id"].ToString()));
      }
 }

6. 확인
아래와 같이 주소창에 페이지 확장명이 없고 해당 페이지에서는 값이 잘 전달된 것을 확인 할 수 있습니다.
 




파일 다운로드 방법

파일 다운로드 방법

--web에서 파일 다운로드 첫번째 방법--
    protected void ExportFile_Click(object sender, EventArgs e)
{
//게시물에서 선택된 파일을 다운로드 위한 메서드
   
      string filename = "nodeReserveExcelfile.xlsx";
string downPath = Server.MapPath(ConfigurationManager.AppSettings["FilePath"]) +  "\\" + filename;                                          //다운로드할 파일경로
if (System.IO.File.Exists(downPath))                                                                                                        // 서버에 파일이 존재할 경우
{
          Response.Clear();
          Response.AddHeader("Content-Type", "application/unknown");
          // web.config 가 <globalization requestEncoding="ks_c_5601-1987" responseEncoding="ks_c_5601-1987" /> 경우
          Response.AddHeader("Content-Disposition", "attachment;filename =" + HttpUtility.UrlEncode(System.IO.Path.GetFileName(filename)).Replace("+", "%20"));
          // web.config 가 <globalization requestEncoding="utf-8" responseEncoding="utf-8" />경우
          //Response.AddHeader("Content-Disposition","attachment;filename="+Server.UrlEncode(Path.GetFileName(selectedItemName)).Replace("+","%20"))
          Response.ContentType = "multipart/form-data";
          Response.WriteFile(downPath);
          Response.Flush();
          Response.End();
return;
}
else// 서버에 파일이 존재하지 않을 경우
{
//files.Attributes.Add("onclick", string.Format("alert('{0}');", "파일이 서버에 존재하지 않습니다")); //파일이 서버에 존재하지 않습니다.
        Response.Write("");
return;
}
}


--web에서 파일 다운로드 두번째 방법--
public void DownloadProgram(string pluginId, string pluginVerId)
    {
      HttpResponse response = HttpContext.Current.Response;

      try
      {
        DataTable dtPluginVersion = null;
        string filePath = string.Empty;
        string programNm = string.Empty;

        IPluginVersionBiz biz = ContextFactory.GetObject<IPluginVersionBiz>("PluginVersionBiz");
        dtPluginVersion = biz.GetPluginProgram(pluginId, pluginVerId);

        if (dtPluginVersion != null && dtPluginVersion.Rows.Count > 0)
        {
          programNm = (string)dtPluginVersion.Rows[0]["sProgramName"];
          filePath = (string)dtPluginVersion.Rows[0]["sUpdUrl"];

          if (!string.IsNullOrEmpty(filePath))
            filePath = WebConfigurationManager.AppSettings["upload"] + filePath;
        }

        response.BufferOutput = false;
        response.Clear();
        response.ClearHeaders();
        response.ContentType = "application/octet-stream";
        response.AddHeader("Content-Disposition", "attachment; filename=" + programNm);
        response.AddHeader("Connection", "close");

        if (!string.IsNullOrEmpty(filePath))
        {
          FileInfo file = new FileInfo(filePath);

          if (!file.Exists)
            throw new FileNotFoundException(programNm);

          byte[] buffer = new byte[4098];
          int readBytes = 0;

          using (FileStream stream = file.OpenRead())
          using (Stream os = response.OutputStream)
          {
            while ((readBytes = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
              if (response.IsClientConnected)
              {
                os.Write(buffer, 0, readBytes);
                os.Flush();
              }
              else
              {
                break;
              }
            }
          }
        }

      }
      catch (Exception ex)
      {
        Debug.WriteLine(ex);
        response.StatusCode = (int)HttpStatusCode.InternalServerError;
        response.Write("");
      }
      finally
      {
        response.Flush();
        response.Close();
        response.End();
      }

    }

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Windows XP에서  Administrator로 로그인

Windows XP에서 Administrator로 로그인


1. 시작 -> 실행 -> REGEDIT [엔터]
2. 레지스트리 트리에서 다음 경로를 찾음.
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Winlogon\SpecialAccounts\UserList
3. 해당경로에 다음 DWORD이름을 입력
   Administrator
   값 : 10진수 >> 1
4. 로그오프하면 Administrator로 로그인할 수 있다. [오류발생시 또는 필요시 재부팅]

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
display, float, clear

display, float, clear

display, float, clear


1. display


block의 정렬은 float  
inline의 요소의 정렬은 text-align


ps. block의 중앙정렬은 정렬을 원하는 block요소에서 margin: 0 auto;를 해주면 중앙 정렬이 된다
단  block의 특성상 width값을 줘야중앙정렬이 된다.



2. float

 block의 정렬을 담당

Attribute
-noneDefault. Object displays where it appears in the text.
-leftText flows to the right of the object.
-rightText flows to the left of the object.



float는 왼쪽으로 붙을지 오른쪽으로 붙을지 결정

float해준 다음 Element 녀석들은 무조껀 그 효과로 인해서 붙어버린다.

이것을 미연에 방지하기위에서 clear을 해주는것이다.
2. clear
clear Attribute
-noneDefault. Floating objects are allowed on both sides.
-leftObject is moved below any floating object on the left side.
-rightObject is moved below any floating object on the right side.
-bothObject is moved below any floating object.

 float된  초기화 

clear:left; : 왼쪽으로 붙은 녀석들만 원래대로
clear:right; : 오른쪽으로 붙은 녀석들만 원래대로
clear:both; 다 떨어져 !
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////