15 ASP.NET 데이터 컨트롤 데이터베이스 처리를 위한 유용한 컨트롤의 집합인 ASP.NET 데이터 컨트롤에 대한 내용을 다룹니다. 데이터 컨트롤을 사용하여 데이터베이스 프로그래밍을 쉽게 처리하는 방법을 살펴봅니다.
15.1 ASP.NET 데이터 컨트롤 15.1.1 소개 ASP.NET의 데이터(Data) 컨트롤은 앞 장에서 본 코드 기반의 입력, 출력, 수정, 삭제 등의 패턴을 최소한의 코드 또는 코드 작성 없이 구현할 수 있도록 설계된 아주 유용한 컨트롤입니다. 이 컨트롤은 코드를 작성하는 시간을 줄이고 비즈니스 로직을 구현하는 데 더 집중하도록 도와줄 것입니다.
15.1.2 데이터 바인딩 SQL Server의 테이블에 있는 데이터를 ASP.NET 서버 컨트롤에 출력하는 일을 데이터 바인딩(Data Binding)이라고 합니다. 데이터 컨트롤 출력 시 특정한 필드 값을 출력할 때는 다음과 같은 구문을 사용합니다.
<%# DataBinder.Eval(Container.DataItem, "필드명", "형식") %> 또는 <%# Eval("필드명", "형식") %>
참고로 XML 데이터 출력은 다음과 같은 형식을 사용하기도 합니다. <%# XPath("요소명") %>
만약 앞으로 배울 DetailsView와 GridView 같은 컨트롤에서 사용자에게 데이터를 입력 받고자 할 때는 다음 구문처럼 Bind() 메서드를 사용합니다. 다음 구문은 텍스트박스에 있는 내용을 컨트롤로 전달 받을 때 사용하는 구문의 예다.
<asp:TextBox ID="txtInput" runat="server" Text='<%# Bind("UserID") %>' />
15.1.3 속성과 템플릿
속성: 속성은 일반적인 컨트롤이 가지고 있는 기능들을 속성 창에서 바로 설정할 수 있는 기능입니다. 템플릿: 템플릿은 속성 창에서 다루기 어려운 서버 컨트롤의 모양과 출력에 대한 기능을 세부적으로 정의하고자 할 때 <디자인 보기> 영역과 <소스 보기> 영역에서 설정할 수 있도록 Visual Studio에서 제공하는 기능입니다.
15.1.4 데이터 소스 컨트롤의 종류 다음은 데이터 소스 컨트롤의 종류를 정리한 것입니다. 이 중에서 SqlDataSource 컨트롤을 가장 많이 사용합니다. 데이터 소스 컨트롤 설명 SqlDataSource SQL Server 같은 관계형 데이터베이스를 사용하려 할 때 사용 AccessDataSource 마이크로소프트사의 Access 데이터베이스를 사용하려 할 때 사용 ObjectDataSource C#의 클래스 같은 개체를 데이터 원본으로 사용하려 할 때 사용 XmlDataSource XML 파일을 데이터 원본으로 사용하려 할 때 사용 LinqDataSource LINQ 쿼리식에 대한 결과를 출력할 용도로 사용 SiteMapDataSource ASP.NET에서 특별히 사용되는 Web.sitemap 파일을 연결하고자 할 때 사용 EntityDataSource Entity Framework와 상호작용을 하기 위해 사용
15.1.5 데이터 컨트롤처럼 기능이 많은 컨트롤 학습법 ASP.NET의 데이터 컨트롤은 많은 속성과 메서드, 템플릿 기능을 제공합니다. 워낙 많으므로 우선 이 책을 통해 간단히 실습해보면서 기본적인 의미를 익히고, 추가로 MSDN에서 각각의 컨트롤이 하는 세부적인 내용을 살펴보는 것을 추천합니다.
15.2 SqlDataSource 컨트롤 SqlDataSource 컨트롤을 사용하면 SQL Server 같은 데이터베이스에서 데이터를 입력, 출력하는 등의 기능을 손쉽게 구현할 수 있고, 심지어 코드 한 줄 타이핑하지 않고도 데이터 입출력이 가능한 페이지를 구성할 수 있습니다. 코드 레벨로 데이터를 출력하는 구문과 비교해보면 SqlDataSource 컨트롤을 사용하여 커넥션(Connection)과 커맨드(Command) 개체를 마우스 클릭으로 포함시킬 수 있어 입력에 소요되는 시간을 절약할 수 있습니다.
15.3 [실습] SqlDataSource 컨트롤로 데이터 쉽게 출력하기 15.3.1 소개 SqlDataSource 컨트롤을 사용하여 Memos 테이블에 있는 데이터를 마우스 클릭 레벨로 출력할 수 있는 페이지를 구현해보겠습니다.
<참고> 이번 실습 과정을 "ASP NET 4.6 웹 폼 데이터 컨트롤 미리 살펴보기"라는 제목의 동영상 강좌로도 마련하였으니 참고하기 바랍니다. https://youtu.be/v2FkJ4z092c </참고>
15.3.2 따라하기 (1) Visual Studio를 실행하고 ASP.NET 웹 응용 프로그램을 다음과 같이 생성합니다. 이름 위치 ASP.NET 템플릿 선택 폴더 및 핵심 참조 추가 DevDataControl C:\ASP.NET ASP.NET 4.6 템플릿-Empty Web Forms, MVC, Web API
(2) 솔루션 탐색기에서 DevDataControl 웹 프로젝트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭한 후 다음과 같이 웹 프로젝트에 새로운 항목을 추가합니다. 템플릿 이름 이름 웹 폼 FrmSqlDataSource.aspx
(3) FrmSqlDataSource.aspx 페이지를 열고 다음과 같이 <디자인 보기>를 선택한 후 도구 상자의 표준 범주에 있는 DropDownList 컨트롤을 드래그해서 떨어뜨려 놓는다. 도구 상자 상단의 검색어 입력란에 Drop만 입력해도 쉽게 DropDownList를 찾을 수 있습니다. 그림 15 1 드롭다운리스트 컨트롤 등록하기
이번에는 도구 상자의 데이터 범주에 있는 SqlDataSource 컨트롤을 드롭다운리스트 컨트롤 옆에 떨어뜨려 놓다. 그림 15 2 SqlDataSource 컨트롤 등록하기
두 컨트롤이 모두 등록된 후의 <디자인 보기>다. 그림 15 3 SqlDataSource 컨트롤을 웹 폼에 올려놓기
도구 상자로 웹 폼에 등록한 컨트롤은 다음과 같습니다. 컨트롤 속성 값 DropDownList ID lstMemoName SqlDataSource ID sdsMemoName
(4) FrmSqlDataSource.aspx 페이지의 <소스 보기>를 선택한 후 등록된 두 컨트롤의 ID 속성을 다음과 같이 변경합니다. <디자인 보기>에서 작업한 내용 대신에 다음 두 줄을 직접 입력해도 결과는 같습니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmSqlDataSource.aspx.cs"
Inherits="DevDataControl.FrmSqlDataSource" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>SqlDataSource 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="lstMemoName" runat="server"></asp:DropDownList>
<asp:SqlDataSource ID="sdsMemoName" runat="server"></asp:SqlDataSource>
</div>
</form>
</body>
</html>
(5) <디자인 보기>에서 마우스로 sdsMemoName이란 이름의 SqlDataSource 컨트롤을 선택하면 오른쪽에 작은 삼각형 버튼이 나타난다. 이를 스마트 태그(Smart Tag) 또는 스마트 태스크(Smart Task)라고 합니다. 이 스마트 태그를 클릭하면 다음과 같은 메뉴가 출력된다(소스 보기에서도 스마트 태그를 호출할 수 있습니다. 소스 보기에서 태그를 선택한 후 [Ctrl]+[.]을 클릭하면 손쉽게 스마트 태스크를 띄울 수 있습니다). 그림 15 4 SqlDataSource 컨트롤의 스마트 태그 실행
(6) 스마트 태그에서 <데이터 소스 구성> 링크를 클릭합니다. <데이터 소스 구성> 창이 나타나면 데이터베이스와 연결하는 연결 문자열 구성을 위해 <새 연결> 버튼을 클릭합니다. 그림 15 5 데이터 연결 선택
(7) "Microsoft SQL Server"를 선택한 후 '계속' 버튼을 클릭합니다. 그림 15 6 데이터 소스 선택 화면
(8) <연결 추가> 창이 나타나면 <서버 이름> 에 LocalDb의 인스턴스 이름인 (localdb)\MSSQLLocalDb를 입력하고 <인증>은 'Windows 인증'으로 처리합니다. <데이터베이스 이름 선택 또는 입력> 부분에 다음 그림과 같이 데이터베이스 연결 문자열 관련 정보를 설정한 후 <연결 테스트> 버튼을 클릭합니다. 정상적으로 연결되었으면 <확인> 버튼을 클릭합니다. 앞서 12장에서 DevADONET 이름으로 SQL Server LocalDb를 구성한 적이 있으니 윈도 인증으로 이를 선택하면 됩니다. 그림 15 7 연결 추가
(9) <데이터 연결 선택> 화면에서 <연결 문자열> 옆의 <+> 버튼을 누르면 설정된 데이터베이스 연결 문자열이 나타난다. 설정된 데이터베이스 연결 문자열은 그림과 같습니다. 확인 후 <다음> 버튼을 클릭합니다. 참고로 데이터베이스 연결 문자열 및 컴퓨터(서버) 이름은 컴퓨터 환경에 따라 다릅니다. 그림 15 8 데이터 연결 선택 완료
(10) <응용 프로그램 구성 파일에 연결 문자열 저장> 화면이 나타난다. 이 텍스트박스에 기록된 이름으로 Web.config 파일에 데이터베이스 연결 문자열이 설정됩니다. 만약 웹 사이트에 Web.config 파일이 없다면 자동으로 생성됩니다. 내용을 확인 후 <다음> 버튼을 클릭합니다. 그림 15 9 응용 프로그램 구성 파일에 연결 문자열 저장
<참고> Web.config 파일의 데이터베이스 연결 문자열
지금까지의 과정을 실행하면 웹 프로젝트 루트에 있는 Web.config 파일의 <connectionStrings>
섹션에 다음과 같은 식으로 데이터베이스 연결 문자열이 지정됩니다. 반대로 먼저 Web.config 파일에 데이터베이스 연결 문자열을 지정 후 현재 화면에서 바로 선택할 수도 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add
name="DevADONETConnectionString"
connectionString="Data Source=(localdb)\MSSQLLocalDb;
Initial Catalog=DevADONET;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
</참고>
(11) <Select 문 구성>
화면이 나타난다. 다음 그림과 같이 <테이블 또는 뷰의 열 지정>을 선택하고, 테이블의 열에는 Num과 Name을 선택한 후 <ORDER BY>
버튼을 클릭합니다. 여기에서 생성하는 Select 문은 SqlDataSource 컨트롤의 SelectCommand 속성에 지정됩니다.
그림 15 10 Select 문 구성
(12) <Order By 절 추가>
창이 뜨면 <정렬 기준>으로 Num 필드를 선택하고, 내림차순을 선택합니다. <확인> 버튼을 클릭하여 <Select 문 구성>
화면으로 돌아옵니다. <다음> 버튼을 클릭하여 <쿼리 테스트> 화면으로 넘어간다.
그림 15 11 Order By 절 추가
(13) <쿼리 테스트> 화면에서는 지금까지 구성한 커넥션과 커맨드가 정상적으로 구성되었는지 테스트합니다. <쿼리 테스트> 버튼을 클릭합니다. 테스트가 정상적으로 진행되어 Num와 Name 컬럼이 제대로 조회되면 <마침> 버튼을 클릭하여 SqlDataSource 컨트롤 설정을 마친다. 여기까지 진행하면 SqlDataSource 컨트롤에 데이터베이스 연결 문자열이 지정되고, SQL 쿼리문이 속성으로 설정됩니다.
그림 15 12 쿼리 테스트
(14) 이어서 DropDownList에 SqlDataSource 컨트롤을 바인딩하는 단계를 살펴보고, 앞서 구성한 SqlDataSource 컨트롤에 들어 있는 커넥션과 커맨드를 표현해보겠습니다. 웹 폼의 디자인 보기 모드에서 드롭다운리스트 컨트롤을 선택한 후 스마트 태그 버튼을 클릭하여 다음과 같이 <데이터 소스 선택> 링크를 클릭합니다. 그림 15 13 DropDownList 컨트롤의 스마트 태그 실행
(15) <데이터 소스 선택> 화면에서 <데이터 소스 선택>에는 앞서 구성한 SqlDataSource 컨트롤의 ID 속성인 sdsMemoName을 지정합니다. <DropDownList에 표시할 데이터 필드 선택>
에는 Name 필드를, 내부적으로 저장될 값인 <DropDownList의 값에 대한 데이터 필드 선택>
에는 Num 필드를 선택한 후 <확인> 버튼을 클릭합니다. 만약 필드 선택 부분이 제대로 표시되지 않는다면 왼쪽 하단의 <스키마 새로 고침> 링크 버튼을 클릭하면 나타날 것입니다.
그림 15 14 DropDownList 컨트롤의 데이터 소스 선택
(16) DropDownList 컨트롤에 SqlDataSource 컨트롤을 지정하면 다음과 같이 데이터가 바인딩되었다는 텍스트로 표시됩니다. 이것으로 커넥션과 커맨드 개체, 데이터 출력 설정까지 모두 완료했습니다. 그림 15 15 DropDownList 컨트롤의 데이터 바인딩 완료
여기까지 진행한 후 FrmSqlDataSource.aspx 페이지의 소스를 보면 (3)번에서 작성된 컨트롤의 기본 소스 외에 추가 코드들이 다음과 같이 자동으로 만들어질 것입니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmSqlDataSource.aspx.cs"
Inherits="DevDataControl.FrmSqlDataSource" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>SqlDataSource 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="lstMemoName" runat="server"
DataSourceID="sdsMemoName" DataTextField="Name" DataValueField="Num">
</asp:DropDownList>
<asp:SqlDataSource ID="sdsMemoName" runat="server"
ConnectionString="<%$ ConnectionStrings:DevADONETConnectionString %>"
SelectCommand="SELECT [Num], [Name] FROM [Memos] ORDER BY [Num] DESC">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
SqlDataSource 컨트롤의 ConnectionString 속성에는 <%$ %> 구문을 사용하여 Web.config 파일에 저장된 데이터베이스 연결 문자열인 DevADONETConnectionString 항목을 지정하는데, ConnectionStrings:데이터베이스연결문자열 형식으로 설정합니다. SelectCommand 속성에는 앞서 도구를 사용해서 지정한 SQL 구문이 설정됩니다. 이렇게 만들어진 SqlDataSource 컨트롤은 DropDownList와 같은 컨트롤의 DataSourceID 속성에 ID 값이 지정되어 사용됩니다.
(17) FrmSqlDataSource.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 페이지 소스 보기를 해보면 다음 그림과 같이 Text는 Name이, Value는 Num이 바인딩하여 출력됩니다. 이로써 코드 한 줄 작성 없이 마우스 클릭만으로도 데이터를 출력하는 ASP.NET의 데이터 컨트롤의 SqlDataSource 컨트롤의 살펴보았습니다. SqlDataSource 컨트롤은 가장 기본으로 뒤에 나오는 대부분의 Data 컨트롤이 사용합니다. 화면 모양은 조금씩 다르겠지만, 나머지 데이터 컨트롤도 지금 진행한 것과 사용법은 비슷합니다.
그림 15 16 드롭다운리스트 컨트롤에 이름 필드 출력 결과
15.3.3 마무리 SqlDataSource 컨트롤은 ASP.NET에서 데이터를 처리하기 위한 커넥션과 커맨드, 데이터 바인딩의 모든 설정을 미리 담고 있다가 바로 데이터를 출력하거나 입력하는 동작을 코드 한 줄 없이 구현하도록 구성되어 있습니다. SqlDataSource 컨트롤은 데이터 컨트롤의 가장 핵심 컨트롤입니다. 이번 실습은 적어도 두 세 번, 각각 다른 필드를 사용하여 연습을 진행하는 것을 권합니다. 그러면 SqlDataSource 컨트롤에 대한 감을 잡을 수 있을 것입니다.
15.4 Repeater 컨트롤 리피터 컨트롤은 Select 문의 결괏값을 레코드가 있는 만큼 반복해서 출력하고자 할 때 사용합니다. 특별히 생성되는 HTML 태그는 없으며 바인딩식으로 행의 데이터만 출력합니다.
15.5 [실습] Repeater 컨트롤로 간단한 데이터 출력하기 15.5.1 소개 SqlDataSource 컨트롤과 Repeater 컨트롤로 Memos 테이블의 데이터를 웹 폼에 출력하는 기능을 구현해보겠습니다.
15.5.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼을 추가합니다. 템플릿 이름 이름 웹 폼 FrmRepeater.aspx
(3) FrmRepeater.aspx 페이지의 <소스 보기> 상태에서 다음 그림과 같이 도구 상자의 데이터 범주에 있는 Repeater 컨트롤과 SqlDataSource 컨트롤을 드래그해서 페이지에 등록합니다.
그림 15 17 Repeater 컨트롤과 SqlDataSource 컨트롤 등록
(4) FrmRepeater.aspx 페이지의 소스를 다음과 같이 작성합니다. Repeater 컨트롤과 SqlDataSource 컨트롤의 이름을 각각 “ctlMemoList”와 “sdsMemoList”로 변경합니다. Repeater 컨트롤의 DataSourceID 속성을 SqlDataSource 컨트롤의 이름인 “sdsMemoList”로 변경합니다. 이는 SqlDataSource 컨트롤에서 지정한 SQL 구문을 Repeater 컨트롤에서 사용하겠다는 의미다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmRepeater.aspx.cs" Inherits="DevDataControl.FrmRepeater" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Repeater 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="ctlMemoList" runat="server"
DataSourceID="sdsMemoList"></asp:Repeater>
<asp:SqlDataSource ID="sdsMemoList" runat="server">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
(5) SqlDataSource 컨트롤에 커서를 두면 다음 그림과 같이 스마트 태스크 아이콘이 나타나는데 이를 선택하거나 [Ctrl]+[.]을 클릭하여 스마트 태스크 창을 띄운다.
그림 15 18 SqlDataSource 컨트롤의 스마트 태스크
(6) 다음 그림과 같이 스마트 태스크 창이 뜨면 <데이터 소스 구성> 링크 버튼을 클릭합니다. 그림 15 19 데이터 소스 구성
(7) <데이터 연결 선택> 창에서는 앞에서 진행한 실습에서 저장해 놓은 데이터베이스 연결 문자열을 선택합니다. <다음> 버튼을 클릭하여 다음 단계로 진행합니다. 그림 15 20 데이터 연결 선택
(8) Select 문 구성 창에서 테이블 이름은 Memos, 열은 <Num>
, <Name>
, <Title>
을 선택한 뒤 오른쪽 영역에 있는 <Order By>
버튼을 클릭합니다.
그림 15 21 SqlDataSource 컨트롤의 Select 문 구성
(9) ORDER BY 절 추가 화면이 나타나면 다음 그림과 같이 <Num>
를 선택하고 내림차순 옵션을 선택하고 <확인> 버튼을 클릭합니다.
그림 15 22 SqlDataSource 컨트롤의 Order By 절 추가
(10) 현재까지 선택한 SELECT문을 그림 하단의 SELECT 문을 확인 후 <다음> 버튼을 클릭합니다.
그림 15 23 Select 문 구성
(11) 쿼리 테스트 화면에서는 <쿼리 테스트> 버튼을 클릭하여 데이터가 있으면 해당 데이터가 조회되는지 확인 후 <마침> 버튼을 클릭하여 설정을 완료합니다. 그림 15 24 쿼리 테스트
(12) 위 단계까지 진행한 후 FrmRepeater.aspx 페이지의 소스는 다음과 같습니다. 스마트 태스크 작업을 거치지 않고 다음과 같이 소스를 직접 작성해도 결과는 같습니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmRepeater.aspx.cs" Inherits="DevDataControl.FrmRepeater" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Repeater 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="ctlMemoList" runat="server"
DataSourceID="sdsMemoList"></asp:Repeater>
<asp:SqlDataSource ID="sdsMemoList" runat="server"
ConnectionString=
'<%$ ConnectionStrings:DevADONETConnectionString %>'
SelectCommand=
"SELECT [Num], [Name], [Title] FROM [Memos] ORDER BY [Num] DESC">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
(13) FrmRepeater.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저가 실행해도 아무런 데이터가 출력되지 않습니다. 이처럼 Repeater 컨트롤은 데이터가 바인딩되어도 출력 모양을 직접 지정해 주어야 내용이 출력됩니다. 그림 15 25 Repeater 적용된 기본 페이지 출력
(14) 이제 다음과 같이 직접 코드를 입력해서 출력 모양을 설정합니다. Repeater 컨트롤 안에 <HeaderTemplate>
섹션부터 <FooterTemplate>
섹션까지의 코드를 추가합니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmRepeater.aspx.cs" Inherits="DevDataControl.FrmRepeater" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Repeater 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="ctlMemoList" runat="server"
DataSourceID="sdsMemoList">
<HeaderTemplate>
<table border="0">
<tr><td>제목</td></tr>
</HeaderTemplate>
<ItemTemplate>
<tr><td><%# Eval("Title") %></td><tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr><td style="background-color:yellow;">
<%# Eval("Title") %></td></tr>
</AlternatingItemTemplate>
<SeparatorTemplate>
<tr><td style="height:1px;background-color:Red;"></td></tr>
</SeparatorTemplate>
<FooterTemplate>
<tr><td>완료</td></tr>
</table>
</FooterTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="sdsMemoList" runat="server"
ConnectionString="<%$ ConnectionStrings:DevADONETConnectionString %>"
SelectCommand=
"SELECT [Num], [Name], [Title] FROM [Memos] ORDER BY [Num] DESC">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
<%# Eval(“열이름”) %>
형태로 각각의 데이터를 출력할 수 있습니다. <HeaderTemplate>
섹션과 <FooterTemplate>
은 데이터 출력의 시작과 끝을 나타냅니다. <ItemTemplate>
섹션은 가장 기본이 되는 데이터가 반복되는 영역인데 <AlternatingItemTemplate>
을 사용하여 홀수 번째와 짝수 번째를 다르게 표현할 수 있습니다. <SeparatorTemplate>
섹션은 데이터 중간에 구분자 역할을 하는 행을 추가로 둘 수 있습니다.
(15) 다시 FrmRepeater.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 이제는 정상적으로 데이터가 앞서 입력한 table 태그와 함께 모양이 구성되어 출력됨을 알 수 있습니다. 나의 환경에서는 현재 Memos 테이블에 3개의 데이터가 있어서 해당 레코드의 Title 값이 나옵니다.
그림 15 26 리피터 컨트롤 웹브라우저 출력 결과
15.5.3 마무리 Repeater 컨트롤은 테이블 태그 같은 태그를 만들지 않고, 출력할 필드의 값만 반복해서 출력해줍니다. 편리성 면에서는 앞으로 다룰 GridView 컨트롤이 편하겠지만, Repeater 컨트롤은 개발자가 모든 레이아웃을 원하는 스타일대로 작성할 수 있도록 해줍니다.
15.6 DataList 컨트롤 데이터 리스트 컨트롤은 Select 문의 결괏값을 테이블 형태로 출력하고자 할 때 필요한 여러 가지 기능을 제공해줍니다.
15.7 [실습] DataList 컨트롤을 사용하여 효과적으로 데이터 진열 15.7.1 소개 SqlDataSource 컨트롤과 DataList 컨트롤로 Memos 테이블의 데이터를 웹 폼에 출력하는 기능을 구현해보겠습니다.
15.7.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼을 추가합니다.
템플릿 이름 이름
웹 폼 FrmDataList.aspx
(3) FrmDataList.aspx의 <디자인 보기>를 선택하고, 다음 표를 참고하여 다음 그림과 같이 컨트롤을 웹 폼에 등록한 후 데이터 소스 구성을 합니다. 그림 15 27 데이터리스트 컨트롤과 SqlDataSource 컨트롤
컨트롤 속성 값 DataList ID ctlMemoList DataSourceID sdsMemoList RepeatColumns 3 RepeatDirection Horizontal SqlDataSource ID sdsMemoList ConnectionString 데이터 소스 구성 마법사 사용 SelectQuery
(4) FrmDataList.aspx의 <소스 보기>를 선택하고 다음과 비슷하게 소스가 작성되었는지 확인하거나 작성합니다. 앞의 실습과 마찬가지로 DataList 컨트롤은 수작업으로 모양을 꾸미고, SqlDataSource 컨트롤은 스마트 태그로 구성하거나 다음과 같이 직접 코드를 작성합니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmDataList.aspx.cs" Inherits="DevDataControl.FrmDataList" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>DataList 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DataList ID="ctlMemoList" runat="server"
DataSourceID="sdsMemoList" BorderWidth="1px"
RepeatColumns="3" RepeatDirection="Horizontal">
<HeaderTemplate>
<span>이름</span>
</HeaderTemplate>
<HeaderStyle Font-Bold="true" />
<ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate>
<ItemStyle ForeColor="Green" />
<AlternatingItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "Name") %>
</AlternatingItemTemplate>
<AlternatingItemStyle ForeColor="Blue" />
</asp:DataList>
<asp:SqlDataSource ID="sdsMemoList" runat="server"
ConnectionString="<%$ ConnectionStrings:DevADONETConnectionString %>"
SelectCommand="Select * From Memos Order By Num Desc">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
(5) FrmDataList.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 참고로 출력되는 데이터는 다를 수 있습니다. 그림 15 28 데이터리스트 컨트롤 출력 결과
만약 데이터가 여러 개 있다면 세 개 이후로는 줄바꿈이 되어 출력됩니다. 이는 DataList 컨트롤에 지정된 RepeatColumns와 RepeatDirection 속성에 따른다. 그림 15 29 3개 이상의 데이터가 있을 때 데이터리스트 컨트롤 출력 결과
15.7.3 마무리 DataList 컨트롤도 모양 꾸미는 부분을 제외하고는 모든 항목을 마우스 클릭으로 구성할 수 있습니다. 이처럼 ASP.NET의 데이터 컨트롤은 작업 시간을 많이 단축해 줍니다.
15.8 DetailsView 컨트롤 디테일뷰 컨트롤은 단일 레코드를 테이블 형식으로 출력하거나 입력할 때 주로 사용합니다. 데이터베이스 처리 패턴 중 상세 패턴과 입력 패턴에 어울리는 컨트롤입니다.
15.9 [실습] DetailsView 컨트롤을 사용하여 단일 데이터 출력 15.9.1 소개 SqlDataSource 컨트롤과 DetailsView 컨트롤을 사용하여 쿼리스트링(QueryString)으로 넘어 온 번호값에 해당하는 레코드를 읽어서 DetailsView 컨트롤에서 출력하는 기능을 구현해보겠습니다.
15.9.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼을 추가합니다.
템플릿 이름 이름
웹 폼 FrmDetailsView.aspx
(3) FrmDetailsView.aspx 페이지에 다음과 같이 코드를 작성합니다. DetailsView 컨트롤과 SqlDataSource 컨트롤을 등록하고 이름을 변경했습니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmDetailsView.aspx.cs" Inherits="DevDataControl.FrmDetailsView" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>DetailsView 컨트롤: 상세 보기 패턴</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DetailsView ID="ctlMemoView" runat="server"
Height="50px" Width="125px"></asp:DetailsView>
<asp:SqlDataSource ID="sdsMemoView" runat="server">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
(4) SqlDataSource 컨트롤의 스마트 태스크를 통해 <데이터 소스 구성> 창을 실행합니다. 앞에서 진행한 실습에서 저장해 놓은 데이터베이스 연결 문자열을 선택합니다. Select 문 구성 화면에서는 다음과 같이 테이블은 Memos, 열은 <*>를 선택하고 <WHERE>
버튼을 클릭합니다.
그림 15 30 Select 문 구성 시 Where 버튼 클릭
(5) <Where 절 추가>
화면에서 다음과 같이 <열>, <연산자>, <소스>, <매개 변수 속성> 값을 입력 후 추가 학습: 버튼을 클릭합니다.
그림 15 31 Where 절 추가
그러면 매개변수 입력 코드가 자동으로 만들어져 추가됩니다. <확인>을 클릭하면 <Select 문 구성>
으로 돌아옵니다. <다음>을 클릭합니다.
그림 15 32 매개변수가 추가된 상태
(6) Where 절을 추가한 후의 Select 문은 다음 그림과 같습니다. WHERER([Num] = @Num) 구문이 추가된 것을 알 수 있습니다. <다음> 버튼을 클릭합니다.
그림 15 33 매개변수가 추가된 Select 문
(7) 매개변수가 사용된 Select 문에 대한 <쿼리 테스트> 페이지에서는 <쿼리 테스트> 버튼을 클릭하여 다음과 같이 <매개 변수 값 편집기>를 띄운다. 그림 15 34 매개 변수 값 편집기
(8) <매개 변수 값 편집기> 창에서 <값>을 입력합니다. 앞에서 봤던 데이터 1번을 입력하고 확인을 누르면 해당 레코드만 출력됩니다. 그림 15 35 쿼리 테스트
(8) FrmDetailsView.aspx의 <소스 보기>를 선택하고 다음과 같이 소스가 작성되었는지 확인하거나 수정합니다. DetailsView 컨트롤에 AutoGenerateRows 속성 및 <SelectParameter>
섹션이 추가된 것을 확인하기 바랍니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmDetailsView.aspx.cs" Inherits="DevDataControl.FrmDetailsView" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>DetailsView 컨트롤: 상세 보기 패턴</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DetailsView ID="ctlMemoView" runat="server" Height="50px" Width="125px"
DataSourceID="sdsMemoView" AutoGenerateRows="true" DataKeyNames="Num">
<Fields>
<asp:BoundField DataField="Num" HeaderText="번호" />
<asp:TemplateField HeaderText="이름">
<ItemTemplate>
<a href="FrmDetailsView.aspx?Num=<%# Eval("Num") %>">
<%# Eval("Title") %>
</a>
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="sdsMemoView" runat="server"
ConnectionString="<%$ ConnectionStrings:DevADONETConnectionString %>"
SelectCommand="SELECT * FROM [Memos] WHERE ([Num] = @Num)">
<SelectParameters>
<asp:QueryStringParameter Name="Num" QueryStringField="Num" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
(5) FrmDetailsView.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행합니다. 데이터가 있는 행의 번호를 ?Num=1이라는 형식으로 넘겨주면 웹 브라우저에 다음과 같이 출력됩니다. AutoGenerateRows 속성에 의해서 모든 필드가 기본값으로 출력되고, 추가로 <Fields>
섹션에 의해서 번호와 이름 필드가 커스터마이징 되어서 출력됩니다.
그림 15 36 DetailsView 컨트롤 출력 결과
15.9.3 마무리 DetailsView 컨트롤은 이렇게 단일 레코드를 출력하는 기능 외에 입력과 수정 기능도 가능합니다.
15.10 FormView 컨트롤 폼뷰 컨트롤은 단일 레코드를 출력할 때 주로 사용합니다. 사용자가 직접 모양을 정의할 수 있고, DetailsView 컨트롤과 마찬가지로 상세 패턴에 어울리는 컨트롤입니다. FormView와 SqlDataSource 컨트롤을 사용하면 마우스 클릭만으로도 특정 테이블에 데이터를 입력할 수 있는 폼을 만들고, 수정과 삭제 등의 기능을 구현할 수 있습니다.
15.11 [실습] FormView 컨트롤을 사용하여 단일 데이터 출력 15.11.1 소개 SqlDataSource 컨트롤과 FormView 컨트롤을 사용하여 쿼리스트링으로 넘어 온 번호값에 해당하는 레코드를 읽어서 FormView 컨트롤에 사용자가 원하는 모양대로 출력해보겠습니다.
15.11.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼을 추가합니다.
템플릿 이름 이름
웹 폼 FrmFormView.aspx
(3) FrmFormView.aspx 페이지에 다음과 같이 코드를 직접 작성합니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmFormView.aspx.cs" Inherits="DevDataControl.FrmFormView" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>FormView 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FormView ID="ctlMemoView" runat="server"
DataSourceID="sdsMemoView" DataKeyNames="Num">
<ItemTemplate>
작성자: <%# Eval("Name") %><br />
메모: <%# Eval("Title") %><br />
</ItemTemplate>
</asp:FormView>
<asp:SqlDataSource ID="sdsMemoView" runat="server"
ConnectionString="<%$ ConnectionStrings:DevADONETConnectionString %>"
SelectCommand="SELECT * FROM [Memos] WHERE ([Num] = @Num)">
<SelectParameters>
<asp:QueryStringParameter Name="Num" QueryStringField="Num" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
(4) FrmFormView.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 이때 주의할 것은 반드시 ?Num=1 식으로 데이터가 있는 행의 번호를 쿼리스트링으로 넘겨주어야 제대로 출력됩니다.
그림 15 37 FormView 컨트롤 실행 결과
15.11.3 마무리 FormView 컨트롤은 DetailsView 컨트롤과 비슷하며 추가로 해당 레코드에 대한 삭제 기능을 구현할 때도 손쉽게 구현이 가능합니다. FormView 컨트롤은 데이터 처리 패턴 중에서 입력과 수정 패턴 또는 삭제 패턴을 구현하는데 가장 적합한 컨트롤입니다.
15.12 GridView 컨트롤
그리드뷰 컨트롤은 ASP.NET에서 제공하는 데이터 컨트롤 중에서 가장 많은 기능을 제공하며 가장 빈번하게 사용됩니다. 데이터 처리 패턴 중 출력 패턴에 어울리는 컨트롤입니다. 그리드뷰 컨트롤은 SqlDataSource 컨트롤에서 제공하는 Select 문의 결과를 자동으로 웹 페이지에 출력하는 뛰어난 기능을 제공합니다.
그리드뷰 컨트롤에 대한 자세한 설명은 다음 문서를 참고하기 바랍니다. 그리드뷰 컨트롤에 대해서 아주 자세히 나와 있습니다.
https://msdn.microsoft.com/ko-kr/library/system.web.ui.webcontrols.gridview(v=vs.110).aspx
그리드뷰 컨트롤보다 좀 더 클라이언트 태그를 자유자재로 변경해서 사용하고 싶다면 또 다른 그리드 컨트롤인 리스트뷰 컨트롤을 사용하는 것도 좋다.
그리드뷰 컨트롤은 다음 코드 조각처럼 <Columns>
섹션을 사용하고, 이곳에 BoundField과 TemplateField 같은 컨트롤을 사용하여 하나의 항목을 출력할 수 있습니다. BoundFileld는 읽기 전용으로 텍스트를 표현할 때 주로 사용하고 TemplateField는 원하는 모든 모양을 <ItemTemplate>
섹션에서 구현하고 데이터는 Eval() 메서드로 출력하는 형태입니다.
<asp:GridView ID="ctlCategoryList" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="CategoryId" HeaderText="카테고리 번호" />
<asp:TemplateField HeaderText="카테고리 이름">
<ItemTemplate>
<%# Eval("CategoryName") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
<div>
<h2>현재 등록된 카테고리가 없습니다.</h2>
</div>
</EmptyDataTemplate>
</asp:GridView>
이상의 그리드뷰 컨트롤에 데이터를 바인딩하는 코드 조각은 다음과 같습니다. DataSet
, DataReader
, List<T>
등의 모든 데이터 형식을 받아서 DataSource 속성에 지정하고 DataBind() 메서드를 호출하는 공식과 같은 코드입니다.
// 카테고리 리스트를 GridView 컨트롤에 출력(바인딩)
ctlCategoryList.DataSource = _repository.GetCategories();
ctlCategoryList.DataBind();
15.13 [실습] GridView 컨트롤을 사용하여 다중 데이터 출력 15.13.1 소개 SqlDataSource 컨트롤과 GridView 컨트롤을 사용하여 Memos 테이블에 있는 모든 데이터를 출력해보겠습니다. 이때 짝수 번째 데이터에는 밑줄을 표시합니다.
15.13.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼을 추가합니다.
템플릿 이름 이름
웹 폼 FrmGridView.aspx
(3) FrmGridView.aspx의 <디자인 보기>를 선택하고 GridView 컨트롤과 SqlDataSource 컨트롤을 웹 폼에 등록합니다. 그리고 다음 표를 참고하여 후 데이터 소스 구성을 합니다. 그림 15-36의 디자인 뷰 모양은 구성을 마치고 최종 완성된 상태입니다. 컨트롤 속성 값 GridView ID ctlMemoList DataSourceID sdsMemoList SqlDataSource ID sdsMemoList ConnectionString 데이터 소스 구성 마법사 사용 SelectQuery
그림 15 38 GridView 컨트롤과 SqlDataSource 컨트롤
(4) FrmGridView.aspx의 <소스 보기>를 선택하고 다음과 같이 소스가 작성되었는지 확인하거나 수정합니다. GridView 컨트롤의 AutoGenerateColumns 속성이 true로 설정되어 따른 작업이 없이도 모든 필드가 자동으로 출력됩니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmGridView.aspx.cs" Inherits="DevDataControl.FrmGridView" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>GridView 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="ctlMemoList" runat="server" AutoGenerateColumns="true"
DataKeyNames="Num" DataSourceID="sdsMemoList">
</asp:GridView>
<asp:SqlDataSource runat="server" ID="sdsMemoList"
ConnectionString='<%$ ConnectionStrings:DevADONETConnectionString %>'
SelectCommand="SELECT * FROM [Memos] ORDER BY [Num] DESC"></asp:SqlDataSource>
</div>
</form>
</body>
</html>
(5) FrmGridView.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 그림 15 39 모든 필드가 출력되는 GridView 컨트롤 실행 결과
(6) 다시 <소스 보기>로 돌아와서 다음과 같이 출력 결과를 새롭게 커스터마이징합니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmGridView.aspx.cs" Inherits="DevDataControl.FrmGridView" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>GridView 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="ctlMemoList" runat="server" AutoGenerateColumns="false"
DataKeyNames="Num" DataSourceID="sdsMemoList">
<Columns>
<asp:BoundField DataField="Num" HeaderText="번호"
HeaderStyle-Width="70px"
HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center" />
<asp:HyperLinkField DataTextField="Title" HeaderText="메모"
DataNavigateUrlFormatString="FrmFormView.aspx?Num={0}"
DataNavigateUrlFields="Num" />
<asp:BoundField DataField="Name" HeaderText="작성자" />
<asp:TemplateField HeaderText="작성일">
<ItemTemplate>
<%# Eval("PostDate", "{0:yyyy-MM-dd}") %>
</ItemTemplate>
<AlternatingItemTemplate>
<em><%# Eval("PostDate", "{0:hh:mm:ss}") %></em>
</AlternatingItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource runat="server" ID="sdsMemoList"
ConnectionString='<%$ ConnectionStrings:DevADONETConnectionString %>'
SelectCommand="SELECT * FROM [Memos] ORDER BY [Num] DESC"></asp:SqlDataSource>
</div>
</form>
</body>
</html>
(7) 다시 웹 브라우저로 실행하면 다음 그림과 같이 사용자 정의된 형태로 출력됩니다. 그림 15 40 사용자 정의된 GridView 출력 결과
15.13.3 마무리 그리드뷰 컨트롤은 엄청나게 많은 기능을 해주는 유용한 컨트롤입니다. 앞서 제시한 MSDN의 설명 자료를 반드시 따라 해보고 그리드뷰 컨트롤의 여러 가지 기능을 익혀두기 바랍니다.
<참고> MSDN의 GridView 예제 모음 http://www.microsoft.com/korea/msdn/asp.net/default.aspx?pull=/korea/msdn/library/ko-kr/dnaspp/html/GridViewEx.asp </참고>
15.13.4 기타 GridView 관련 소스 조각들 15.13.4.1 체크박스 선택했을 때 해당 레코드의 특정 값 가져오기
protected void btnCompare_Click(object sender, EventArgs e)
{
List<string> c = new List<string>();
foreach (GridViewRow row in ctlBoardList.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
CheckBox chk = (row.FindControl("chkSelect") as CheckBox);
HiddenField hdn = (row.FindControl("hdnSelect") as HiddenField);
if (chk.Checked)
{
c.Add(hdn.Value);
}
}
}
15.13.4.2 세자리수 콤마 적용: DataFormatString <asp:BoundField DataField="법인세" HeaderText="법인세" SortExpression="법인세" DataFormatString="{0:N0}" ItemStyle-HorizontalAlign="Right"></asp:BoundField>
15.14 XmlDataSource 컨트롤 XmlDataSource 컨트롤은 표준 컨트롤의 Xml 컨트롤과 비슷하게 XML 파일에 접근할 때 필요한 기능을 담고 있습니다. XML 파일에 저장된 데이터를 Data 컨트롤로 전달할 때 효과적입니다.
15.15 [실습] XmlDataSource 컨트롤로 XML 문서 출력하기 15.15.1 소개 XML 파일에 저장된 데이터를 XmlDataSource 컨트롤을 사용하여 간단하게 웹 폼에 출력해보겠습니다.
15.15.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼과 XML 파일을 추가합니다.
템플릿 이름 이름
웹 폼 FrmXmlDataSource.aspx
XML 파일 FrmXmlDataSource.xml
(3) FrmXmlDataSource.xml 파일에 다음과 같이 타이핑합니다. 이 자료는 특별한 형식 없이 관심 분야를 제목과 설명으로 그룹화 해놓은 것입니다.
<?xml version="1.0" encoding="utf-8" ?>
<Interests>
<Interest>
<title>Windows Server</title>
<description>Best Operation System</description>
</Interest>
<Interest>
<title>SQL Server</title>
<description>Nice DataBase Management System</description>
</Interest>
<Interest>
<title>C#</title>
<description>Cool Programming Language</description>
</Interest>
<Interest>
<title>ASP.NET</title>
<description>Perfect Web Application Framework</description>
</Interest>
</Interests>
(4) FrmXmlDataSource.aspx의 <디자인 보기>를 선택하고 DataList 컨트롤과 XmlDataSource 컨트롤을 웹 폼에 등록합니다. 컨트롤 속성 값 XmlDataSource ID xmlMyInterest DataList ID ctlMyInterest
그림 15 41 XmlDataSource 컨트롤과 DataList 컨트롤
(5) FrmXmlDataSource.aspx의 <소스 보기>를 선택하고 다음과 같이 소스를 작성합니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmXmlDataSource.aspx.cs"
Inherits="DevDataControl.FrmXmlDataSource" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XmlDataSource 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DataList ID="ctlMyInterest" runat="server"
DataSourceID="xmlMyInterest">
<ItemTemplate>
<em><%# XPath("title") %></em>: <%# XPath("description") %>
</ItemTemplate>
</asp:DataList>
<asp:XmlDataSource ID="xmlMyInterest" runat="server"
DataFile="~/FrmXmlDatasource.xml"></asp:XmlDataSource>
</div>
</form>
</body>
</html>
FrmXmlDataSource.xml의 title과 description 요소를 출력시킬 때는 XPath(“title"), XPath(“description”) 구문으로 출력할 수 있습니다.
(6) FrmXmlDataSource.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다.
그림 15 42 XmlDataSource 컨트롤 실행 결과
15.15.3 마무리 XmlDataSource 컨트롤이 특별히 대단한 컨트롤은 아닙니다. 다만, Xml 문서를 보기 좋게 편집하는 기능을 앞서 학습한 데이터리스트 컨트롤과 연관 지을 수 있다는 데 큰 의의를 둔다.
15.16 ObjectDataSource 컨트롤 ASP.NET Web Forms 4.6의 ObjectDataSource 컨트롤은 C#의 클래스 내에 정의된 메서드를 사용하여 데이터의 입출력 등의 작업을 하고자 할 때 사용합니다. SqlDataSource 컨트롤로 대부분 처리되지만, 좀 더 규모가 크고 복잡한 로직을 처리할 때는 ObjectDataSource 컨트롤이 유용합니다.
15.17 [실습] ObjectDataSource 컨트롤로 메서드 실행 결괏값 받기 15.17.1 소개 Memos 테이블의 모든 데이터를 읽어오는 C# 메서드를 생성하고, 해당 메서드의 결괏값을 ObjectDataSource로 가져와 GridView 컨트롤로 출력하는 코드를 작성해보겠습니다.
15.17.2 따라하기 (1) Visual Studio에서 <파일 > 열기 > 프로젝트/솔루션>을 클릭하여 앞서 생성한 DevDataControl을 불러옵니다.
(2) 솔루션 탐색기에서 DevDataControl 웹 사이트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭합니다. 다음과 같은 이름으로 웹 사이트에 웹 폼과 클래스를 추가합니다.
템플릿 이름 이름
웹 폼 FrmObjectDataSource.aspx
클래스 FrmObjectDataSourceClass.cs
(3) FrmObjectDataSourceClass.cs 파일에 다음과 같이 타이핑합니다.
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DevDataControl
{
public class FrmObjectDataSourceClass
{
public SqlDataReader GetMemos()
{
SqlConnection objCon = new SqlConnection();
// Web.config 파일의 커넥션 스트링 값 읽어오기
objCon.ConnectionString =
ConfigurationManager.ConnectionStrings[
"DevADONETConnectionString"].ConnectionString;
objCon.Open();
SqlCommand objCmd = new SqlCommand();
objCmd.Connection = objCon;
objCmd.CommandText = "ListMemo";
objCmd.CommandType = CommandType.StoredProcedure;
// 데이터리더 값을 반환하고 커넥션 종료
return objCmd.ExecuteReader(CommandBehavior.CloseConnection);
}
}
}
(4) FrmObjectDataSource.aspx 파일을 열고 <소스 보기> 상태에서
(5) 다음 그림과 같이 <비즈니스 개체 선택> 화면에서 앞서 작성한 FrmObjectDataSourceClass 클래스를 선택한 후 <다음> 버튼을 클릭합니다. 그림 15 44 데이터 소스 구성
(6) <데이터 메서드 정의> 화면에서는 네 가지 SQL 구문에 해당하는 적절한 메서드를 지정해줍니다. <메서드 선택>에서는 Select 관련 메서드인 GetMemos() 메서드를 선택합니다. ObjectDataSource 컨트롤에서 설정한 데이터 메서드를 정의한 후에 <마침> 버튼을 눌러 데이터 소스 구성을 마친다. 그림 15 45 데이터를 가져올 Select 메서드 정의
(7) GridView 컨트롤의 DataSourceID 속성의 값을 ObjectDataSource 컨트롤의 ID값으로 지정한 후 전체 완성된 소스는 다음과 같습니다. 직접 코드로 입력해도 결과는 같습니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmObjectDataSource.aspx.cs"
Inherits="DevDataControl.FrmObjectDataSource" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>ObjectDataSource 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="ctlMemoList" runat="server"
DataSourceID="odsMemoList"></asp:GridView>
<asp:ObjectDataSource ID="odsMemoList" runat="server"
SelectMethod="GetMemos"
TypeName="DevDataControl.FrmObjectDataSourceClass"></asp:ObjectDataSource>
</div>
</form>
</body>
</html>
(8) FrmObjectDataSource.aspx 페이지를 시작 페이지로 설정 후 웹브라우저로 실행하면 다음 그림과 같이 Memos 테이블에 있는 모든 데이터가 화면에 출력됨을 알 수 있습니다.
그림 15 46 ObjectDataSource 컨트롤 실행 결과
15.17.3 마무리 데이터를 처리하는 로직은 앞 장에서 배웠던 것처럼 컨트롤과 코드 기반으로 모두 구성할 수 있습니다. 다만, SqlDataSource 컨트롤과 ObjectDataSource 컨트롤 등의 데이터 컨트롤을 사용하면 코드 작성을 거의 하지 않고 편하게 데이터 입출력을 구현할 수 있습니다. 웹 페이지를 작성할 때 코드 기반으로 작성할지 컨트롤 기반으로 작성할지는 개발자가 결정합니다. 참고로 컨트롤을 사용하여 도구에서 제공하는 기능보다는 직접 코드 기반에서 세세한 작업을 직접 코드로 만드는게 훨씬 더 수월하고 빠른 이유로 실제 현업에서는 컨트롤 기반보다는 코드 기반으로 대부분 진행합니다.
15.17.4 ObjectDataSource 컨트롤로 게시판 페이징 처리 데모 소스
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MySummaryControl.ascx.cs" Inherits="MemoEngine.Supports.Controls.MySummaryControl" %>
<%--게시판 리스트 작성 시작--%>
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="card">
<div class="card-header">
Q&A 게시판
</div>
<div class="card-body">
<div class="table-responsive">
<%--게시판 그리드--%>
<asp:GridView ID="ctlBoardList" runat="server"
DataSourceID="objSupports"
AllowPaging="true"
PageSize="5"
PagerStyle-BackColor="White" PagerStyle-Font-Size="XX-Small"
AutoGenerateColumns="false"
DataKeyNames="Id"
HeaderStyle-CssClass="text-center"
HeaderStyle-HorizontalAlign="Center"
Width="100%"
CssClass="table table-bordered table-hover table-striped table-condensed articleList">
<HeaderStyle CssClass="thead-light" />
<PagerStyle HorizontalAlign="Center" />
<EmptyDataTemplate>
<div style="width: 100%; height: 130px; border: 1px solid red; text-align: center; vertical-align: middle;">
<br />
<br />
<span style="color: red;">입력된 데이터가 없습니다.
</span>
<br />
<br />
</div>
</EmptyDataTemplate>
<Columns>
<asp:TemplateField HeaderText="번호" HeaderStyle-Width="50px" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<%# Eval("Id") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="분류" HeaderStyle-Width="50px" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<%# ConvertToCategoryString(Eval("Category")) %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="제 목" ItemStyle-HorizontalAlign="Left" HeaderStyle-Width="350px">
<ItemTemplate>
<%# MemoEngine.Supports.BoardLibrary.FuncStep(Eval("Step")) %>
<asp:HyperLink ID="lnkTitle" runat="server" NavigateUrl='<%# "~/Supports/SupportDetails.aspx?Id=" + Eval("Id") %>'>
<%# MemoEngine.Supports.StringLibrary.CutStringUnicode(Eval("Title").ToString(), 40) %>
</asp:HyperLink>
<%# MemoEngine.Supports.BoardLibrary.ShowCommentCount(Eval("CommentCount")) %>
<%# MemoEngine.Supports.BoardLibrary.FuncNew(Eval("PostDate"))%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="파일" HeaderStyle-Width="70px" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<%# MemoEngine.Supports.BoardLibrary.FuncFileDownSingle(Convert.ToInt32(Eval("Id")), Eval("FileName").ToString(), Eval("FileSize").ToString(), "Supports") %>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Name" HeaderText="작성자" HeaderStyle-Width="60px" ItemStyle-HorizontalAlign="Center"></asp:BoundField>
<asp:TemplateField HeaderText="작성일" ItemStyle-Width="90px" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<%# MemoEngine.Supports.BoardLibrary.FuncShowTime(Eval("PostDate")) %>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="ReadCount" HeaderText="조회수" ItemStyle-HorizontalAlign="Right" HeaderStyle-Width="60px"></asp:BoundField>
</Columns>
</asp:GridView>
<%--게시판 그리드--%>
</div>
</div>
<div class="card-footer">
<asp:HyperLink ID="btnWrite" runat="server" NavigateUrl="~/Supports/SupportCreate.aspx" CssClass="btn btn-primary" Width="200px">질문하기</asp:HyperLink>
</div>
</div>
</div>
<!-- /.col-->
</div>
<%--게시판 리스트 작성 종료--%>
<asp:ObjectDataSource ID="objSupports" runat="server"
EnablePaging="true"
TypeName="MemoEngine.Supports.Controls.MySupport"
SelectMethod="GetSupports"
SelectCountMethod="GetSupportsCount"
StartRowIndexParameterName="startIndex"
MaximumRowsParameterName="maxRows"></asp:ObjectDataSource>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
namespace MemoEngine.Supports.Controls
{
public partial class MySummaryControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 카테고리 Value를 다시 카테고리 Text로 변경
/// </summary>
protected string ConvertToCategoryString(object objCategory)
{
string category = objCategory.ToString();
string r = "기타";
switch (category)
{
case "Question":
r = "질문";
break;
case "Request":
r = "건의";
break;
default:
r = "기타";
break;
}
return r;
}
}
public class MySupport
{
// 특정 사용자의 전체 리스트(페이징 처리)
public List<Support> GetSupports(int startIndex, int maxRows)
{
using (var db = new SupportContext())
{
string userName = HttpContext.Current.Session["UserName"].ToString();
if (All.AccountHandler.HasGroup("Administrators"))
{
return db.Supports
.OrderByDescending(s => s.Ref)
.ThenBy(s => s.RefOrder)
.Skip(startIndex)
.Take(maxRows).ToList();
}
else
{
return db.Supports
.Where(s => s.UserName == userName)
.OrderByDescending(s => s.Ref)
.ThenBy(s => s.RefOrder)
.Skip(startIndex)
.Take(maxRows).ToList();
}
}
}
// 특정 사용자의 전체 레코드 수
public int GetSupportsCount()
{
using (var db = new SupportContext())
{
string userName = HttpContext.Current.Session["UserName"].ToString();
if (All.AccountHandler.HasGroup("Administrators"))
{
// 관리자면 전체 레코드 수
return db.Supports.Count();
}
else
{
// 일반 사용자면 자신이 쓴 글에 대한 레코드 수
return db.Supports.Where(s => s.UserName == userName).Count();
}
}
}
}
}
15.18 ASP.NET Chart 컨트롤 15.18.1 Chart 컨트롤 소개 ASP.NET은 Chart 컨트롤을 제공하여 웹 페이지에 원하는 여러 가지 형태의 Chart를 손쉽게 구현할 수 있습니다. 단일 컨트롤이지만 수많은 옵션을 제공하여 많은 기능을 구현할 수 있기에 기본적인 Chart 기능을 한 번 구현해보고자 합니다. 추가 기능은 마이크로소프트에서 제공하는 샘플 웹사이트를 참고하면 원하는 여러 형태의 Chart를 구현할 수 있을 것입니다.
15.18.2 Chart 사용 샘플 웹사이트 다음 경로는 ASP.NET Chart 컨트롤에 대한 사용법과 직접 실행해서 구현된 모양을 살펴볼 수 있는 샘플 웹사이트다. 사이트를 방문해 다운로드 항목에 있는 샘플 소스를 내려받습니다. 내려받은 Samples Environments for Microsoft Chart Controls.zip 파일의 압축을 푼 다음 Visual Studio로 해당 폴더를 <프로젝트 열기>로 연 후 Default.aspx 페이지를 실행하면 ASP.NET Chart 컨트롤에 대한 여러 가지 사용 예를 카테고리 별로 살펴볼 수 있습니다. 이 자료는 아주 유용합니다. http://www.dotnetnote.com/ChartControl
그림 15 47 ASP.NET Chart 컨트롤 사용 예
15.18.2.1 JavaScript 차트(Chart) 라이브러리 http://www.highcharts.com/ http://www.chartjs.org/ http://www.liquidx.net/plotkit/ http://www.jqplot.com/
15.19 [실습] Chart 컨트롤을 사용하여 데이터 시각화하기 15.19.1 소개 웹 페이지에 이미지 기반 Chart를 그려주는 ASP.NET Chart 컨트롤을 다뤄 보겠습니다.
<참고> 이번 실습 과정을 "Chart 컨트롤을 사용하여 데이터 시각화하기"라는 제목의 동영상 강좌로도 마련하였으니 참고하기 바랍니다. https://youtu.be/sbKmjNUfMMM </참고>
15.19.2 따라하기 (1) Visual Studio를 실행하고 ASP.NET 웹 응용 프로그램을 다음과 같이 생성합니다. 이름 위치 ASP.NET 템플릿 선택 폴더 및 핵심 참조 추가 DevChartControl C:\ASP.NET ASP.NET 4.6 템플릿-Empty Web Forms
(2) 솔루션 탐색기에서 DevChartControl 웹 프로젝트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭한 후 다음과 같이 웹 프로젝트에 웹 폼을 추가합니다. 템플릿 이름 이름 웹 폼 FrmChartControl.aspx
(3) FrmChartControl.aspx 파일에 다음 그림과 같이 도구 상자의 데이터 범주에 있는 Chart 컨트롤을 <디자인> 영역으로 드래그 앤 드롭합니다. 여기서 주의할 점은 다른 컨트롤들과 달리 Chart 컨트롤은 <디자인> 보기에서 컨트롤을 등록해야 합니다. 그래야만 Web.config 파일에 Chart 컨트롤 사용에 필요한 설정들이 자동으로 만들어진다.
그림 15 48 ASP.NET 웹 폼에 Chart 컨트롤 등록
<디자인> 영역에 등록된 Chart 컨트롤의 모습입니다. 그림 15 49 등록된 Chart 컨트롤
Chart 컨트롤에 대한 기본 소스가 다음과 같이 생성됩니다.
<div>
<asp:Chart ID="Chart1" runat="server">
<Series>
<asp:Series Name="Series1"></asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="ChartArea1"></asp:ChartArea>
</ChartAreas>
</asp:Chart>
</div>
(4) 위에서 기본 생성된 Chart 소스를 바탕으로 FrmChartControl.aspx 페이지에 다음과 같이 전체 소스 코드를 추가 입력합니다. 참고로 다음 Register 지시문은 자동으로 등록되는 코드입니다.
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="FrmChartControl.aspx.cs" Inherits="DevChartControl.FrmChartControl" %>
<%@ Register Assembly=
"System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>ASP.NET Chart 컨트롤</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>선언적 방식</h3>
<asp:Chart ID="ctlChart1" runat="server">
<Series>
<asp:Series Name="Series1" ChartType="Column" YValuesPerPoint="2">
<Points>
<asp:DataPoint AxisLabel="국어" YValues="90,0" />
<asp:DataPoint AxisLabel="영어" YValues="100,0" />
<asp:DataPoint AxisLabel="수학" YValues="95,0" />
</Points>
</asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="ChartArea1"></asp:ChartArea>
</ChartAreas>
</asp:Chart>
<hr />
<h3>프로그래밍 방식</h3>
<asp:Chart ID="ctlChart2" runat="server">
<Series>
<asp:Series Name="Series1"></asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="ChartArea1"></asp:ChartArea>
</ChartAreas>
</asp:Chart>
<hr />
<a href=
"http://weblogs.asp.net/scottgu/built-in-charting-controls-vs-2010-and-net-4-series">
http://weblogs.asp.net/scottgu/built-in-charting-controls-vs-2010-and-net-4-series
</a>
</div>
</form>
</body>
</html>
(5) FrmChartControl.aspx.cs 파일을 열고 다음과 같이 코드를 작성합니다.
using System;
using System.Web.UI.DataVisualization.Charting;
namespace DevChartControl
{
public partial class FrmChartControl : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DisplayChart();
}
private void DisplayChart()
{
ctlChart2.Series[0].ChartType = SeriesChartType.Column;
ctlChart2.Series[0].Points.AddXY("국어", 90);
ctlChart2.Series[0].Points.AddXY("영어", 100);
ctlChart2.Series[0].Points.AddXY("수학", 95);
}
}
}
(6) FrmChartControl.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고 [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 그림 15 50 ASP.NET Chart 컨트롤 웹 브라우저로 실행 결과
두 Chart가 같은 모양을 출력하는데 첫 번째 Chart는 선언적 방식으로 HTML 소스 레벨에서 작성한 내용이고, 두 번째 Chart는 프로그래밍 방식으로 C# 코드 레벨에서 작성한 것입니다. 실제로 웹 앱 작성시에는 프로그래밍 방식이 월등히 많이 사용됩니다. Chart와 같은 컨트롤은 그 자체만으로도 책 한 권 분량이 나옵니다. 그래서 이번 실습의 내용은 매우 간단합니다. 소스 안에 제시한 URL에는 Chart 컨트롤에 대해 더 많은 정보를 얻을 수 있는 링크가 제시됩니다. 나 역시 현업에서 수많은 Chart와 서로 다른 모양을 필요로 할 때 ASP.NET Chart 컨트롤 샘플 웹사이트 소스의 여러 가지 유형을 보고 따라서 그리다보니, 웬만한 Chart는 다 그려낼 수 있게 되었습니다. 일단 Chart 컨트롤이 있다는 정도로 기억하고 있다가 많은 Chart를 그려내야 할 경우에는 위 URL을 다시 한번 참고하거나 검색 엔진을 통해서 관련 정보를 추가로 얻기를 바랍니다. ASP.NET Chart 컨트롤에 대한 추가 정보를 위한 위 소스에서의 URL은 다음과 같습니다. http://weblogs.asp.net/scottgu/built-in-charting-controls-vs-2010-and-net-4-series
추가 학습: 15.19.2.1 Chart 컨트롤 다운로드 경로 https://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591 다운로드한 소스는 아래 폴더에 저장해 놓음 \ASP.NET\Samples Environments for Microsoft Chart Controls
15.19.3 마무리 ASP.NET Chart 컨트롤은 그 기능을 모두 설명하기에는 책 한 권으로도 부족합니다. 이번 예제는 말 그대로 ASP.NET Chart 컨트롤이 기본으로 제공되고 있다는 정도의 설명만 할 뿐 여러 가지 추가 기능들은 앞서 소개한 샘플 예제 사이트 및 Taeyo.NET 사이트의 Chart 관련 강좌 등을 참고하기 바랍니다. 컴퓨터를 조금 공부하다 보면 당연히 알아야 하는 것 중 하나가 엑셀(Excel)이라는 프로그램입니다. 표 형태의 데이터를 바탕으로 수많은 Chart를 손쉽게 그려주는 기능도 제공하는데, 엑셀에서의 화려한 Chart 기능을 모두 제공하지는 않지만, 웹에서 표현할 수 있는 괜찮은 모양의 Chart는 ASP.NET Chart 컨트롤에서도 대부분 제공합니다. 기본적인 Chart를 그려보았으니, 좀 더 세밀한 Chart를 그려보고자 하는 독자가 있다면 MSDN에서 ASP.NET Chart를 검색해보기 바랍니다.
<참고> ASP.NET Core MVC를 사용하여 교차 플랫폼 차트 만들기 구글 차트, Google Chart https://www.codeproject.com/Articles/1243682/Create-Cross-Platform-Charts-with-ASP-NET-Core-MVC </참고>
추가 학습: 15.20 강력한 형식의 데이터 바인딩 ItemType 속성으로 특정 클래스 타입을 데이터 컨트롤에 줄 수 있습니다. 데이터 바인딩 자리에서는 Eval() 메서드 대신에 Item.속성 값을 사용할 수 있습니다.
모델 바인딩 메서드 InsertMethod UpdateMethod DeleteMethod SelectMethod
모델 바인딩 특성 [Control] [Cookie] [Form] [QueryString] [Profile] [Route] [Session] [ViewState]
15.21 HTML 인코딩 데이터 바인딩 표현식 <%#: %> 형식을 사용하여 HTML을 인코딩하여 출력할 수 있습니다.
추가 학습:
15.22 WYSIWYG 에디터인 CKEditor를 ASP.NET 웹 폼에 적용하기
- DevWysiwyg 프로젝트 생성합니다. Empty + Web Forms
- NuGet에서 jQuery를 다운받습니다.
- NuGet에서 CKEditor Standard 4.X 버전을 다운로드 받습니다.
- 웹 폼 페이지 추가합니다.
- 웹 폼 페이지에 다음과 같이 코드를 작성합니다.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="DevWysiwyg.Default" ValidateRequest="false" %>
<form id="form1" runat="server">
<div>
<h1>WYSIWYG 에디터</h1>
<asp:TextBox ID="txtContent" runat="server" TextMode="MultiLine"
ClientIDMode="Static"></asp:TextBox>
<hr />
<asp:Button ID="btnSave" runat="server" Text="저장" OnClick="btnSave_Click" />
<hr />
<asp:Literal ID="strContent" runat="server"></asp:Literal>
</div>
<script src="Scripts/jquery-3.2.1.min.js"></script>
<script src="Scripts/ckeditor/ckeditor.js"></script>
<script>
$(function () {
CKEDITOR.replace('txtContent');
});
</script>
</form>
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSave_Click(object sender, EventArgs e)
{
strContent.Text = txtContent.Text;
}
- 실행 후 텍스트박스에 값을 입력 후 저장 버튼을 클릭하면 리터럴 컨트롤에 HTML이 출력됩니다.
15.23 퀴즈
- Windows Forms 및 Web Forms에서 DataGrid와 같은 컨트롤에 DataSet 또는
List<T>
형태의 컬렉션 데이터를 출력할 때 사용하는 속성은 무엇인지 고르세요. a. ItemSource b. DataSource c. DataBind d. Database
정답: b DataSource 속성을 사용하여 데이터를 바인딩합니다.