반응형

이번에는 VS 2005 의 TOOL 로 개발한 ASP.NET 과 ASP.NET AJAX 을 VS 2008 로 해당 웹사이트를 호출했을때 문제점을 어떻게 처리해야 하는지에 대해서 설명을 하고자 합니다.


1. VS 2005 툴에서 개발한 ASP.NET 2.0 버전을 VS 2008 TOOL 로 호출할 경우!

- VS 2005 툴로 해당 솔류션 파일을 열거나 파일 경로로 ASP.NET 2.0 을 호출할 경우, VS 2008 은 .NET FRAMEWORK 3.5 로 업그래이드를 할 것인지 아래와 같은 이미지로 확인창을 알려줍니다.



이미지를 클릭하면 원본을 보실 수 있습니다.


2. YES 버튼을 선택하고, 만약에 Microsoft AJAX 을 ASP.NET 2.0 에서 개발한 사례가 있으면 3.5 버전으로 UPGRADE 되면서 아래와 같은 경고창이 발생됩니다.


이미지를 클릭하면 원본을 보실 수 있습니다.


이 오류는 System.Web.Extensions Version 1.0.61025.0 을 로드하지 못해서 발생한 경고창입니다.


이미지를 클릭하면 원본을 보실 수 있습니다.


VS 2008 의 에러리스트에서 상세히 보여주고 있죠. 해당 파일 경로는 WEB.CONFIG 의 30번째 라인에 기술된 태그값에 문제가 있다고 지적했고요. 그 부분을 살펴보죠.


3. ASP.NET 2.0 에서 AJAX 을 구현한 Web.Extensions (AJAX) 때문에 오류가 발생되었는데요. WEB.CONFIG 파일에 구버전의 값이 할당되어 수정해야 합니다.


이미지를 클릭하면 원본을 보실 수 있습니다.


기존 ASP.NET 2.0 은 별개로 MS AJAX 을 사용했으며, 3.5 부터는 내장되어 있습니다.

WEB.CONFIG 파일에서 1.0.61025.0 버전을  3.5.0.0 버전으로 변경작업을 하죠.


이미지를 클릭하면 원본을 보실 수 있습니다.



만약에 AJAX Control Toolkit 까지 설치하여 애용을 했다면 약간의 수정 작업이 필요합니다.


이미지를 클릭하면 원본을 보실 수 있습니다.


VS 2008 툴의 디자인 단에서 보면 탭컨테이너가 로드 되지 못한것을 확인할 수 있는데요.

우선 ASP.NET 3.5 버전의 AJAX Control Toolkit 을 다운받으셔서 설치해야 합니다. 이는 http://ajax.asp.net 사이트에서

다운로드를 받으실 수 있습니다.


다운받은 zip 파일은 원하는 폴더에 압축을 풀면 됩니다. 비스타 일경우, 파일의 속성을 선택하여 "Unblock" 을 선택하고 압축을 풀면 되겠습니다.


이제 Visual Studio Toolbox 의 탭을 하나 만드시고, 가져오기를 하여 만들어  Ajax Control Toolkit 을 페이지단에 추가 합니다. 그러면 아래와 같은 화면을 보실 수 있는데요.


이미지를 클릭하면 원본을 보실 수 있습니다.


해당 bin 폴더에 기존의 AjaxContrlToolkit.dll 파일을 새로운 것으로 대체할 것인지를 물어보면 "모든 아이템 적용"을 선택하고  yes 버튼을 선택하면 적용됩니다.


이미지를 클릭하면 원본을 보실 수 있습니다.


html 가서 확인을 하시면 위와 같이 버전이 변경되어 있는것을 확인 하실 수 있습니다.



** 이 뿐만 아니라 다른 부분 또한 .net framework 3.5 에서 새로 나온 컨트롤 및 asp.net 2.0 에서 사용했던 특정 클래스나 네임스페이가 다소 변경된 부분을 정정 할 수도 있습니다.



도움이 되셨는지는 모르겠네요. 처음 접하시는 분들께는 약간의 단비가 될 수 있을까 해서 올린 것이오니 많은 애용 바랍니다.


- 출처 닷넷(.NET) 프로그래머 모임(다음)

반응형
반응형

ASP.NET 서버 컨트롤은 서버에서 실행되고 사용자 인터페이스 및 기타 관련 기능을 캡슐화하는 구성 요소입니다. ASP.NET 서버 컨트롤은 ASP.NET 페이지 및 ASP.NET의 코드 숨김 클래스에서 사용됩니다. 이 단원에는 사용자가 자신의 ASP.NET 서버 컨트롤을 개발하도록 도와주는 배경 정보 및 예제가 들어 있습니다.

http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpcondevelopingwebformscontrols.asp

반응형
반응형
처음에 Calendar컨트롤을 사용할 때 이걸 어떻게 해야하는거야

하는 막막함이 앞서 있었다. MS에서 제공하는 기본 템플릿을 사용한것이

다였으니.ㅋㅋ

Calendar컨트롤에 날짜의 배경색과 글자색을 변경하기 위해서는

내가 쓰는 방법으로는 Calendar컨트롤이 렌더링되는 시점에서 설정을 잡아주면 된다.

Calendar의 Render이벤트 핸들러를 통하면 된는건데.

CS단에서
protected void calendar_DayRender(object sender, DayRenderEventArgs e)
{
     // 예를 들어 15일에 대해서 날짜의 Style을 변경하겠습니다.
     if(e.Day.DayNumberText == "15")
     {
           e.Cell.BackColor = System.Drawing.Color.원하는색깔; // 배경색
           e.Cell.ForeColor = System.Drawing.Color.원하는색깔; // 글짜색
      }
}

간단하지 않습니까?ㅋㅋ

보통 블로그에서 언제 스크랩한 날이 있는지를 달력 같은데 Bold처리를 통하여

표시하는 곳이 많은데 DB에서 스크랩한 날의 정보를 Binding하여 날짜값만을

추출해 옴니다.

그래서 반복문을 통하여 날짜값을 이용하여 위의 간단한 예제를 이용하면

쉽게 날짜의 Style을 설정하실 수 있을 거예요.^^
반응형
반응형

일단 그리드뷰에서 HyperLinkField을 하나 만드세요.  그 필드의 속성값에 원하는 다음페이지에 넘길 필드을 무제한 설정하세요 이 샘플은 3개의 값을 넘기는것입니다.


진한 부분이 속성입니다.  그 속성갑에 원하는 값을 다음과 같이 하시면 됩니다.


<asp:HyperLinkField DataNavigateUrlFields="cms_key1,cms_key2,cms_key3" DataNavigateUrlFormatString="./fa_m01.aspx?id={0}@{1}@{2}"  DataTextField="cms_name" HeaderText="     품      명    " Target="_self" >

 /asp:HyperLinkField>


받는 .CS프로 그램에서 다음과 같이 쪼게어 사용하시면 됩니다.


vCode = Request.QueryString[0]; // 전 페이지에서 넘어온 아규먼트

string[] abc = vCode.Split(new char[] { '@' });

agkey1 = abc[0];

agkey2 = abc[1];

agkey3 = abc[2];


이렇게 받아서 쓰시면 됩니다.  참고가 되면 좋겠습니다.

반응형
반응형
HOONS닷넷 출처
http://www.hoons.kr/Lectureview.aspx?key=Lecture&LECCATE_IDX=9&ref=1&lecture_idx=32


사용자 삽입 이미지
[그림 FreeTextBox]

-이미지와 스타일 다운로드 :

- DLL, ftp.inserttable.aspx 다운로드 :
1. 도구상자에서 오른쪽 마우스를 눌러보면 "항목 추가 / 제거" 라는 메뉴가 나타난다.
사용자 삽입 이미지

2. 항목 추가 / 삭제 목록을 열어 보면 아래와 같은 창이 뜬다. 여기서 찾아보기 버튼을 누른다.
사용자 삽입 이미지

3. 아까 전에 준비했었던 bin이라는 폴더에 HoonsTextBox.dll이라는 파일을 선택
사용자 삽입 이미지

4. 선택을 하면 아래와 같이 항목에 추가가 되는것을 볼 수 있을것이다. 이제 확인 버튼을 누르고
   창을 나와보자.
사용자 삽입 이미지

5. 이제 FreeTextBox라는 항목이 생긴다.
사용자 삽입 이미지

6. 아래와 같은 컨트롤이 표시가 된다. 이제 이 컨트롤들의 속성에 이미지와 스타일을
   셋팅해주게 되면 되는것이다.
사용자 삽입 이미지

7. 텍스트 박스의 속성을 경로 부분이 있다. 아래와 같이 이미지와 스타일의 경로를 적는다.
   그리고 Toolbar Type에 따라서 보드 툴색이 변하게 된다는것을 잊지말자.
사용자 삽입 이미지

8. 이제 실행을 시켜보면 에디터 게시판이 완성된것을 볼 수 있을것이다.
   (ID)라는 부분의 속성을 이용해서 ID값을 편집할 수 있고, 안의 내용도
   Text라는 속성으로 접근한다. 기존의 텍스트 박스와 유사하기 때문에
   이용하는데 특별히 불편한 사항은 없을것이다.
반응형
반응형

항목을 프로그래밍 방식으로 추가하려면

  1. ListItem 형식의 새 개체를 만든 다음 TextValue 속성을 설정합니다.

  2. 컨트롤의 Items 컬렉션에 대한 Add 메서드를 호출하여 새 개체에 전달합니다.

    다음 예제는 ListItem 개체를 ListBox 컨트롤에 추가하는 방법을 보여 줍니다. 이 프로시저는 모든 list 웹 서버 컨트롤에 동일하게 적용됩니다.

    Visual Basic
    Protected Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        ListBox1.Items.Add(New ListItem("Carbon", "C"))
        ListBox1.Items.Add(New ListItem("Oxygen", "O"))
    End Sub
    
    Protected void Button1_Click (object sender, System.EventArgs e)
    {
        ListBox1.Items.Add(new ListItem("Carbon", "C"));
        ListBox1.Items.Add(new ListItem("Oxygen", "O"));
    }
    
반응형
반응형
<%@ Page language="C#" %>

<script runat="server">

  void AuthorsGridView_RowUpdating (Object sender, GridViewUpdateEventArgs e)
  {
    // The GridView control does not automatically extract updated values

    // from TemplateField column fields. These values must be added manually

    // to the NewValues dictionary.

 
    // Get the GridViewRow object that represents the row being edited

    // from the Rows collection of the GridView control.

    int index = AuthorsGridView.EditIndex;

    GridViewRow row = AuthorsGridView.Rows[index];

   
    // Get the controls that contain the updated values. In this

    // example, the updated values are contained in the TextBox

    // controls declared in the edit item templates of each TemplateField

    // column fields in the GridView control.

    TextBox lastName = (TextBox)row.FindControl("LastNameTextBox");

    TextBox firstName = (TextBox)row.FindControl("FirstNameTextBox");

   
    // Add the updated values to the NewValues dictionary. Use the

    // parameter names declared in the parameterized update query

    // string for the key names.

    e.NewValues["au_lname"] = lastName.Text;
    e.NewValues["au_fname"] = firstName.Text;    
  }
</script>

<html>
  <body>
    <form runat="server">
      <h3>TemplateField EditItemTemplate Example</h3>
      <!-- The GridView control automatically sets the columns     -->
      <!-- specified in the datakeynames attribute as read-only.   -->
      <!-- No input controls are rendered for these columns in     -->
      <!-- edit mode.                                              -->

      <asp:gridview id="AuthorsGridView"
        datasourceid="AuthorsSqlDataSource"
        autogeneratecolumns="false"
        autogenerateeditbutton="true"
        datakeynames="au_id"
        cellpadding="10"
        onrowupdating="AuthorsGridView_RowUpdating"      
        runat="server">
               
        <columns>
          <asp:boundfield datafield="au_id"
            headertext="Author ID"
            readonly="true"/>

          <asp:templatefield headertext="Last Name"
            itemstyle-verticalalign="Top">
            <itemtemplate>
              <%#Eval("au_lname")%>
            </itemtemplate>

            <edititemtemplate>
              <asp:textbox id="LastNameTextBox"
                text='<%#Eval("au_lname")%>'
                width="90"
                runat="server"/>
              <br/>
              <asp:requiredfieldvalidator id="LastNameRequiredValidator"
                controltovalidate="LastNameTextBox"
                display="Dynamic"
                text="Please enter a last name."
                runat="server" />                                      
            </edititemtemplate>
          </asp:templatefield>

          <asp:templatefield headertext="First Name"
            itemstyle-verticalalign="Top">
            <itemtemplate>
              <%#Eval("au_fname")%>
            </itemtemplate>

            <edititemtemplate>
              <asp:textbox id="FirstNameTextBox"
                text='<%#Eval("au_fname")%>'
                width="90"
                runat="server"/>
              <br/>

              <asp:requiredfieldvalidator id="FirstNameRequiredValidator"
                controltovalidate="FirstNameTextBox"
                display="Dynamic"
                text="Please enter a first name."
                runat="server" />                      
            </edititemtemplate>
          </asp:templatefield>

          <asp:checkboxfield datafield="contract"
            headertext="Contract"
            readonly="true"/>
        </columns>
      </asp:gridview>

      <!-- This example uses Microsoft SQL Server and connects -->
      <!-- to the Pubs sample database.                         -->
      <asp:sqldatasource id="AuthorsSqlDataSource"  
        selectcommand="SELECT [au_id], [au_lname], [au_fname], [contract] FROM [authors]"            
        updatecommand="UPDATE authors SET au_lname=@au_lname, au_fname=@au_fname WHERE
(authors.au_id = @au_id)"
        connectionstring="server=localhost;database=pubs;integrated security=SSPI"
        runat="server">
      </asp:sqldatasource>
    </form>
  </body>
</html>
반응형
반응형

<태오님 홈페이지에서 가져온 글입니다.!!>

ASP.NET 2.0 - 테마를 이용한 UI

ASP.NET이 처음 선을 보였을 때 이 강좌를 읽고 계신 모든 분들께서는 코드비하인드라는 생소한 단어를 접하셨던 기억이 있을 것입니다. 코드비하인드는 HTML코드와 CS를 완전히 분리하여 관리하는 개념이었습니다. 테마는 이와 같은 맥락으로 볼 수 있는데 이는 HTML(웹컨트롤, HTML컨트롤 등)과 디자인을 다시 분리한다고 말할 수 있습니다. 이렇게 분리 했을 경우 테마의 수정만으로 ASPX파일을 수정하지 않고 페이지의 디자인을 완전히 변경할 수 있게 됩니다. 기존에 CSS스타일시트를 이용한 경우와 비슷한 부분이 있습니다. 하지만 테마는 스타일시트의 장점과 더불어 컨트롤의 속성과 이미지파일을 다룰 수 있어 보다 유연하게 작업이 가능합니다.

그럼 시작해 보도록 하겠습니다.

가장 먼저 테마가 적용될 페이지를 만들어 보도록 하겠습니다.

<asp:Button ID="btn1" runat="server" Text="글쓰기" />
<asp:GridView ID="gv1" runat="server"></asp:GridView>

Theme가 적용될 페이지의 코드는 위와 같이 간단하게 버튼과 GridView컨트롤을 추가하였습니다.  ID, runat, Text와 같이 디자인과는 관련이 없는 속성3개만이 추가 되었습니다.  이제 테마를 만들어 보도록 하겠습니다. 테마를 만들기 위해서는 우선 Theme폴더를 생성해야 하는데요 ASP.NET 폴더 추가→Theme를 선택합니다. 그럼 App_Themes폴더가 생성되고 하위로 Theme1폴더가 생성됩니다. Theme1폴더를 이제 우리가 사용할 테마명으로 변경합니다. 기본이 되는 테마를 먼저 만들어 봐야 하니까 테마폴더 명을 Basic라고 바꾸도록 하죠..

 

App_Themes폴더내의 실제 테마에 해당하는 폴더는 계속해서 추가 할 수 있습니다. 해당 테마폴더 내부에는 스킨(.skin), 스타일시트(.css), 이미지(jpg, gif, png,...)가 추가될 수 있습니다.

이제 테마를 만들어 보도록 하겠습니다.

Basic테마 폴더에서 새 항목 추가를 선택한 다음 skin파일을 추가합니다.

 

스킨파일에서 실제 컨트롤의 스킨을 만들 수 가 있는데 이때 ID값은 제외하고 디자인에 관련된 여러 속성들을 일반적인 컨트롤을 추가할 때와 동일하게 추가합니다. 이때 주의할 점이 runat="server"는 반드시 추가해야 한다는 것입니다. 추가하지 않을 경우 파서오류가 나타나게 됩니다. 그럼 만들어진 스킨파일을 보면

<asp:Button runat="server" BackColor="#507CD1" ForeColor="#ffffff" BorderStyle="Solid" BorderWidth="1px" BorderColor="#003399" />

<asp:GridView runat="server" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Horizontal">
    <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <RowStyle BackColor="#EFF3FB" /> <EditRowStyle BackColor="#2461BF" />  
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
    <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <AlternatingRowStyle BackColor="White" />
</asp:GridView>

상당히 복잡해 보이십니까? 네.. 복잡합니다. ㅡ.ㅡ;; 잘 보시면 aspx파일의 컨트롤 작성 방법과 상당히 비슷하다는 걸 느끼실 수 있을 것입니다.  ID값을 제외하고 UI와 관련된 대부분의 속성들이 정의되어있습니다.  샘플을 꼭 저렇게 복잡하게 해야겠냐구요? ㅎㅎ  사실대로 말씀 드리자면 위의 스킨은  ASP.NET의 자동서식을 이용해서 만들어진 것입니다..^^ 적용될 페이지에서 자동서식을 이용해 UI관련 작업을 한 후 그대로 스킨파일에 복사한 후 ID값만 지원준거죠.. 그러니 복잡해 보인다고.. 혹시 뭐 중요한거 있나 하고.. 너무 열심히 들여다 보지는 마세요..^^

아무튼 스킨파일생성까지 완료 했습니다.  이제 생성된 스킨을 실제 페이지에 적용해야 하는데 이를 수행할 수 있는 방법에는 몇 가지가 있습니다.  우선 테마가 적용된 결과부터 보고 설정하는 방법에 대해 알아보도록 하겠습니다.

 

결과가 상당히 화려한가요? ㅡ.ㅡ 아무튼 스킨이 적용된 것이 그나마 좀 나아 보이기는 하죠?^^ 실제 적용하는 부분을 알아보도록 하겠습니다.

1. 전역적인 테마 설정

<system.web>
   <pages theme="테마명" />
</system.web>

2. 페이지 별 테마 설정

<%@ Page Language="C#" ......  Theme="테마명" %>

3. 동적 테마 설정

protected void Page_PreInit(object sender, EventArgs e)
{
   Page.Theme = "테마명";
}

1,2번의 경우는 별다를 것이 없지만 3번 동적 테마 설정에서 특이한 점을 발견할 수 있습니다. PreInit메서드에서 테마명을 잡아주게 되는데요.. 그 이유는 페이지 주기에서 가장 먼저 실행되는 부분이  바로 PreInit입니다. 이때는 어떤 컨트롤도 생성된 상태가 아니죠.. 컨트롤이 생성되기 전에 테마가 먼저 생성되고 그 후에 그 속성들이 각 컨트롤에 적용되는 것입니다. 드롭다운 리스트와 같은 곳에 테마를 미리 설정해 두고 각 테마를 선택할 때 이를 적용시킬 경우 위와 같이 작업해 줄 수 있습니다.

드롭다운리스트에서 값을 받아 테마를 설정 할 경우 PreInit메서드는 아직 컨트롤이 생성되기 전 단계이므로 드롭다운리스트의 SelectedValue를 통하여 값을 가져올 수 없습니다. 해결 방법은 Rqeust.Param["컨트롤아이디"]로 접근할 경우 값을 가져올 수 있습니다.

그럼 동적 테마 설정의 실행 결과를 보도록 하겠습니다.

 

우선 두개(Basic, Black)의 테마를 만들고 드롭다운리스트에 테마의 이름을 넣어준 다음 포스트백이 일어날 때 PreInit메서드에서 Page.Theme에 Request.Param으로 받아온 테마명를 설정했습니다. 그다지 멋지지는 않군요 ㅡ.ㅡ;; 이를 잘 응용하면 보다 멋진 테마를 만들실 수 있을 것입니다.

테마를 설정할 경우 Theme속성 외에도 StylesheetTheme라는 것이 있는데 StylesheetTheme는 Theme와 동일하게 @Page지시자 , Web.config, 비하인드 코드에서 사용할 수 있습니다. StylesheetTheme가 존재하는 이유는 이것으로 테마를 설정할 경우 동일한 속성에 대해 스킨파일에서 선언된 속성보다 실제 적용 페이지 내에서 선언된 속성이 우선순위를 갖고 Theme속성에 테마를 설정한 경우 그 반대가 됩니다.  

지금까지 테마를 생성해서 스킨을 만들고 이를 적용하는 것 까지 해보았습니다. 이미 눈치 채신 분들도 있을 텐데요.. 그럼 스킨파일에 버튼을 하나 만들면 테마가 적용된 페이지에서는 모든 버튼의 디자인이 동일해야 하나? 라고 생각하시는 분들이 계실 것 같습니다.  당연히 이 부분을 처리 할 수 있어야겠죠? 해결방법은 상당히 간단 합니다. SkinID속성을 이용하면 간단하게 문제가 해결됩니다.

<asp:Button runat="server" BackColor="#507CD1" ForeColor="#ffffff" BorderStyle="Solid" BorderWidth="1px" BorderColor="#003399" />

<asp:Button runat="server" BackColor="#507CD1" ForeColor="#ffffff" BorderStyle="Solid" BorderWidth="3px" BorderColor="red" SkinID="Delete" />

스킨파일에서 이미 선언되어 있던 버튼을 그대로 복사한 후 BorderWidth와 BorderColor를 바꾸었습니다. 그리고 SkinID속성을 추가 했습니다.  컨트롤의 개수와는 상관없이 SkinID만 중복 되지 않으면 원하는 만큼 다른 스타일의 버튼을 정의 할 수 있습니다.

<asp:Button ID="btnWrite" runat="server" Text="글쓰기" />
<asp:Button ID="btnDelete" runat="server" Text="삭제" SkinID="Delete"  />
<asp:GridView ID="gv1" runat="server"></asp:GridView>

실제 적용하는 부분인데요.. 상당히 간단합니다. 그냥 위에서 선언했던 버튼의 SkinID값만 추가 해 주면 끝입니다.

그럼 결과를 보겠습니다.

 

위의 결과는 테마와 SkinID를 모두 동적으로 처리해본 경우 입니다.

App_Themes폴더 내부에는 여러개의 Theme폴더가 존재 할 수 있고, Theme폴더 내부에는 다수의 skin, css, 이미지 파일이 존재 할 수 있습니다. 예를 들면 스킨파일의 경우 Button.skin, Gridview.skin을 생성하고 Button.skin에는 버튼에 관련된 스킨만, Gridview.skin엔 그리드뷰에대한 스킨만 정의 하는 코드를 만들고 각각 내부에서 SkinID로 구분지어 주면 보다 관리 하기 용이한 테마를 만들 수 있을 것다는 필자의 생각입니다.^^

지금까지 ASP.NET 2.0에서 지원하는 Theme에 대해 알아봤습니다. 그다지 어려운 부분은 없지만 잘 활용하면 상당히 유용하게 쓰일 수 있을 것 같습니다. ASP.NET 2.0의 개인화에 더해져 사용자 별로 다른 유저인터페이스를 제공하고 주기적으로 사이트의 레이아웃을 변경 할 수 있다는 점 등. 응용할 수 있는 부분은 상당히 많다고 생각됩니다. 본 강좌에서는 간단한 부분만을 다루었기 때문에 결과물에 별로 만족하지 못하시겠지만 스타일시트와 스킨을 적절히 이용하면 스킨의 변경만으로도 완전히 다른 모습으로 보이게 할 수도 있습니다. 물론 샘플로 제공해 드리진 못했지만 ㅡ.ㅡ 이 강좌를 참고해 보다 멋진 테마를 이용한 사이트를 만들 수 있었으면 합니다.

이번 강좌에 쓰인 소스를 원하시면 클릭하세요 ^^

다음 번엔 좀 더 좋은 내용의 강좌로 뵙도록 하겠습니다.

반응형

+ Recent posts