대상 : ASP.NET의 기본적인 컨트롤 사용법을 뗀 이들.
선수지식 : ADO.NET 기본 지식.

이번에는 말입니다.

ASP.NET 웹 폼 컨트롤들 중에서 가장 활용빈도가 높고, 가장 유용한 컨트롤이라 할 수 있는 바운드(Bound) 관련 컨트롤들에 대해서 이야기 를 쬐금(실은 많이 -_-+)해보려 합니다. 반복 값 바인딩(Binding)이 가능한 이러한 컨트롤들을 이용하면 표(Grid) 형태의 출력을 갖는 조금은 복잡한 결과 물도 쉽게 렌더링 할 수가 있답니다. 그러니 실무에서는 대단히 유용하게 사용할 수 있는 것이죠

물론, 이익을 보는 부분이 있으면 그에 동반하여 피곤해지는 부분도 있는 법인데, 이들의 경우는 사용법이 조금은 난해하다는 점이 피곤한 부분이 되겠슴다. 하지만, 막상 처음에는 어려워 보이던 것들도 친숙해지고 나면 쉬워지는 법이라는 것 아시죠?? 자주 이 컨트롤을 사용하다 보면 컨트롤의 사용법이 상당히 직관적이라는 것을 깨닫게 될 것입니다. 그리고, 표 형태의 출력을 요하는 작업을 수행할 경우는 주저없이 이 컨트롤들을 선택하게 될 겁니다요. 처음에는 어려워 보이지만, 알고나면 상당히 유용한 컨트롤인 것이지요...

현재 ASP.NET에서 기본적으로 제공하는 바운드 컨트롤에는 Repeater, DataList, DataGrid가 있는데요. 나열한 순서에 따라 더욱 많은 기능을 제공하며, 그에 따라 다루기도 훨씬 복잡한 편입니다. 그러므로, 각각의 상황에 맞게 적절한 컨트롤을 사용하는 것이 중요하지요. 물론, 이러한 선택은 각각의 컨트롤에 대해 익숙해지고 난 다음에 여러분이 스스로 결정해야 할 부분이기는 합니다. 각각의 컨트롤들이 나름대로의 특성을 가지고 있기 때문이죠.

하지만, 살짝만 미리 언급한다면 가벼운 출력을 위해 DataGrid를 사용하는 것은 전혀 효율적이지 못한 선택이랍니다. 그렇게 되면 사용하지도 않을 기능들로 인해 리소스의 낭비, 실행시간의 지연 등의 비효율적인 결과를 얻게될 것이기 때문이죠. 또한, 복잡한 기능의 출력을 위해 Repeater 컨트롤을 사용하는 것도 결코 바람직하지 않습니다. 그렇게 된다면, 상당한 분량의 코드를 여러분이 직접 작성해야만 할 것이니 말입니다. 그렇다면, 바람직한 선택은 무엇일까요? 그 질문의 답은 이 장을 마친 후, 여러분이 스스로 말할 수 있을 것입니당~~ keke

하지만, 시작하기 전에 굳이 제가 먼저 추천을 드리자면...

Repeater 컨트롤 단순 표 형태의 출력을 위해서만 강추합니다.
오로지 단순 출력용으로만 말입니다
DataList 컨트롤

쇼핑몰에서 상품을 진열할 때 캡숑 좋습니다.
페이징이 어렵다는 단점이 있는데.. 이 부분은 제가 알려드리는 XControls.NET의 PagingHelper 컨트롤을 사용하면 무척이나 쉽게 구현이 가능합니다. DataGrid의 페이징과 사용법이 완전 동일하거든요. 간단하지만, 멋진 컨트롤인 XControls.NET의 PagingHelper를 나중에 소개할 시간이 있을 겁니다. (이 컨트롤을 사용하면 Repeater, DataList, DataGrid 모두에서 디자인도 이쁜 페이징을 쉽게 맘껏 구현이 가능하답니다)

DataGrid 컨트롤 대부분의 기능적인 표 목록을 위해서 사용합니다. 주로 게시판 형태의 구조를 가질 경우는 무조건 이넘입니다!!

실무에서는 앞으로 다룰 컨트롤 중 DataList 와 DataGrid를 주로 사용합니다. 사실, Repeater 컨트롤은 그렇게 사용하는 일이 많지는 않은 편이죠. 개발자마다의 취향에 따라 선택될 부분이기는 하지만, 일반적으로는 그러한 것 같습니다. (현재, 저는 믿거나 말거나 금융권에서 ASP.NET을 기반으로 하는 규모있는 프로젝트를 진행하고 있는 중인데요, 이쪽에서는 적어도 그러한 편이랍니다).

문제는 이 3개의 컨트롤을 모두 배우는 것이 상당한 분량이라는 사실입니다. 그렇다고 해서, Repeater 컨트롤은 경시하고, DataList와 DataGrid 컨트롤쪽에 무게를 싣는 것이 그리 바람직하지는 않은데요. 그것은 Repeater 컨트롤이 다른 컨트롤들(DataList, DataGrid)의 일부로 포함되는 형태를 갖는 컨트롤이기 때문이랍니다. 즉, 여러분이 Repeater 컨트롤을 다룰 줄 모른다면, 이어지는 Grid 컨트롤을 다룰 경우, 배우기 매우 어렵게 느낄 가능성이 크다는 이야기이요. 해서, 앞으로의 내용이 비록 조금은 길고, 따분할 수 있다고 하더라도 반드시 거쳐가야 하는 과정이니 결코 건너뛰기 식의 학습을 하지는 말아달라는 부탁을 하고 싶습니다.

저의 유치 찬란한 개그로 여러분이 따분하지 않도록 최선을 다할 것이니 말입니다.. 핫핫핫!!!

그렇다면, 이제 시작해 보시지요~~~~


Template 기반의 컨트롤

바운드 컨트롤이라고도 불리는 각각의 컨트롤들(Repeater, DataList, DataGrid)은 템플릿을 기반으로 하여 데이터의 바인드 목록을 만듭니다. 즉, 템플릿(Template)이라는 것을 사용하여 데이터들을 화면에 출력한다는 것이죠.

템플릿이라고 하는 것은 컨트롤이 화면에 출력할 각 항목(아이템-Item-이라고도 표현합니다)을 의미하는 것으로, 이를 이용하면 출력할 항목을 기능과 특성에 따라 여러 가지의 형태로 표현할 수 있습니다. 실제적인 데이터 바인드는 이러한 템플릿 내에서 지정되어지게 되며, 바인딩 표현식을 사용하여 직접 코드로 작성해야 합니다.

모든 것을 컨트롤이 알아서 해주지는 않습니다. 어떤 데이터를 어디에, 어떻게 출력할 것인지는 여러분이 바인드 표현식으로 직접 템플릿 내에 작성해 주어야 합니다. 일단은 컨트롤이 템플릿이라는 것을 사용하여 항목 데이터를 출력한다는 사실 정도만을 기억해 두세요. 구체적인 내용은 각각의 컨트롤에 대해서 다룰 때에 구체적으로 설명할 것입니당~~

Repeater 컨트롤과 DataList에서는 기본적으로 하나의 항목(아이템)이 하나의 행으로 표현됩니다. 하지만, 그렇다고 언제나 항목이 행을 의미하는 것은 아닌데요. DataGrid에서는 하나의 항목이 하나의 셀을 의미하기도 하기 때문이지요.. ^^;


데이터 바인딩 표현식

템플릿 안에 데이터를 바인드하기 위해서는 데이터 바인딩 표현식을 사용해야 합니다. 혹시 기존에 데이터 바인딩을 공부해 보신 분이 있다면(주로, List 컨트롤들을 위해서) 바인딩 표현식이 무엇인지 그리고 어떻게 작성하는지 알고 계시겠지만, 바운드 컨트롤을 사용할 경우에는 바인딩 표현식이 기존에 여러분이 알고 계신 것과는 조금 다릅니다. 이 경우, 사용하는 바인딩 표현식은 다음과 같아요.

<%# Container.DataItem["바인드할 필드명"] %>

여기서 Container는 현재 컨트롤에 DataSource로 지정된 데이터 원본이라고 보시면 됩니다.

만일, 우리가 Pubs 데이터베이스의 titles 테이블을 DataSet으로 가져와서, 그 테이블을 Repeater 컨트롤의 DataSource로 지정하였다면(즉, titles 테이블의 데이터를 이 컨트롤에 바인드 하겠다고 묶어두었다면), 그 titles 테이블의 DataView가 바로 Container가 되는 것이죠. 그리고, DataItem은 현재 그 테이블에서 표시된 행을 의미합니다. 고로, Container.DataItem는 현재 바인드되는 데이터 테이블의 한 행이라고 볼 수 있는 것이죠.

하지만, C# 코드에서는 바인드 표현식을 위처럼만 작성하면 예외가 발생합니다. 제대로 데이터를 바인드 하기 위해서는 위의 표현식을 사용하기 전에, DataRowView 형식으로 Container.DataItem을 변환한 다음 사용해야 하기 때문이지요. Container.DataItem이 확실하게 하나의 Row임을 명확하게 해 준 다음에 사용해야 문제가 없다는 이야기입니다. 다음과 같이 말이죠.

<%# ((DataRowView)Container.DataItem)["바인드할 필드명"] %>

혹은, Eval 메서드를 사용하여 데이터를 표현할 수도 있습니다. 대부분의 개발자들이 이 방법을 사용하는데, 이 방법은 데이터를 특정 포맷으로 출력하고자 할 경우에 특히 유리한 방법입니다. 단, 그러한 이점을 얻는 대신 약간의 오버헤드(부하)를 일으키는 것은 감수해야 하죠.

<%# DataBinder.Eval(Container.DataItem, "필드명") %>
<%# DataBinder.Eval(Container.DataItem, "필드명", "포맷 문자열") %>

이러한 표현식의 사용방법이나 효과는 예제를 통하지 않고는 이해하기가 어려운 편입니다. 그렇다면, 이제 본격적으로 시작해 보도록 하죠. 바운드 컨트롤 중 가장 간단하면서 가장 빠르고, 또한 기본이 되는 컨트롤인 Repeater 컨트롤을 시작으로 말이죠 ^^

+ Recent posts