ASP.NET의 DataGrid에 총계 필드 추가
저자:Eve Cole
업데이트 시간:2009-06-30 15:40:15
포럼에서 가장 자주 묻는 질문 중 하나는 "DataGrid에서 열 합계를 어떻게 표시합니까?"입니다. 이 질문에 대해서는 제가 개인적으로 샘플 코드를 여러 번 제공했기 때문에 DotNetJunkies라는 제목으로 그러한 가이드를 제공하고 싶었습니다. 이 가이드에서는 프로그래밍 방식으로 DataGrid의 열 값을 계산하고 DataGrid 바닥글에 총 값을 표시하는 방법을 배웁니다. 이 가이드의 다운로드 가능한 예제에는 C# 및 Visual Basic.NET 코드가 모두 포함되어 있습니다.
이 가이드의 최종 결과는 다음과 같습니다.
위 그림에서 볼 수 있듯이:
위에서 사용한 화면 그림의 DataGrid는 매우 일반적인 DataGrid입니다. 두 개의 BoundColumns를 사용하여 데이터를 조작하는 DataGrid의 모양을 제어하는 속성은 많지만 이것이 가장 중요한 것은 아닙니다. 이를 잘 수행하기 위해 정말 중요한 것은 DataGrid.OnItemDataBound 이벤트를 사용하는 것입니다. 이 이벤트는 레코드가 DataGrid에 바인딩될 때마다 트리거됩니다. 이 이벤트에 대한 이벤트 핸들러를 생성하여 데이터 레코드를 조작할 수 있습니다. 이 경우 런타임 시 Price 열의 총 값을 가져옵니다.
바닥글은 데이터 범위의 마지막 행을 나타냅니다. 이 행이 정규화되면 이벤트 처리 중에 Price 열의 런타임 통계를 얻을 수 있습니다.
구현 :
먼저 Web Forms 출력을 조작하는 방법을 찾아보겠습니다. 이 자습서에서는 웹 양식(calcTotals.aspx)과 클래스 코드 파일(calcTotals.aspx.cs)을 사용합니다. 이 가이드의 목적은 클래스 코드가 Just-In-Time 컴파일러를 사용하여 컴파일되는 것입니다. calcTotals.aspx의 코드는 다음과 같습니다.
<%@ Page Inherits="myApp.calcTotals" Src="20010731T0101.aspx.cs" %>
|
AutoGenerateColumns="거짓" CellPadding="4" 셀 간격="0" BorderStyle="단색" BorderWidth="1" Gridlines="없음" BorderColor="검정색" ItemStyle-Font-Name="베르다나" ItemStyle-Font-Size="9pt" HeaderStyle-Font-Name="베르다나" HeaderStyle-Font-Size="10pt" HeaderStyle-Font-Bold="True" HeaderStyle-ForeColor="흰색" HeaderStyle-BackColor="파란색" FooterStyle-Font-Name="베르다나" FooterStyle-Font-Size="10pt" FooterStyle-Font-Bold="True" FooterStyle-ForeColor="흰색" FooterStyle-BackColor="파란색" OnItemDataBound="MyDataGrid_ItemDataBound" 쇼바닥글="참">
|
ItemStyle-HorizontalAlign="오른쪽" HeaderStyle-HorizontalAlign="가운데" />
|
Web Forms에서는 @Page를 사용하여 페이지가 상속하는 클래스 코드를 직접 선언합니다. SRC 속성은 클래스 코드가 JIT 컴파일러를 사용하여 컴파일됨을 나타냅니다. Web Forms의 코드 스타일 선언 대부분은 DataGrid를 더 보기 좋게 만드는 데 사용됩니다.
지정된 마지막 속성 중 하나는 OnItemDataBound 속성입니다. 이 이벤트는 OnItemDataBound 이벤트가 발생할 때 트리거됩니다.
Web Form의 DataGrid(MyGrid)에는 두 개의 BoundColumn이 포함되어 있습니다. 하나는 제목이고 다른 하나는 가격입니다. Pubs 데이터베이스(SQL Server)에 있는 Titles 테이블의 제목 및 가격 열이 여기에 표시됩니다.
코드 정의 무시
수업 코드는 모든 곳에서 사용됩니다. 클래스 코드에서는 Page_Load 이벤트와 MyGrid_OnItemDataBound 이벤트라는 두 가지 이벤트를 작동할 수 있습니다. 런타임 통계에 대한 수학적 연산을 간단히 수행하는 데 사용할 수 있는 비공개 메서드 CalcTotal도 있습니다.
클래스 코드의 기본 구조 블록의 시작:
시스템 사용; System.Web 사용; System.Web.UI 사용; System.Web.UI.WebControls 사용; System.Web.UI.HtmlControls 사용; System.Data 사용; System.Data.SqlClient 사용;
네임스페이스 myApp { 공개 클래스 calcTotals : 페이지 { 보호된 DataGrid MyGrid; 개인 이중 runningTotal = 0; } } |
클래스 코드의 기본 구조에서 네임스페이스(namespace)를 임포트하려면 해당 구문을 사용해야 합니다. 클래스 선언에서 두 개의 변수를 선언합니다. 하나는 클래스 코드에서 웹 양식의 DataGrid(MyGrid) 컨트롤을 매핑하는 변수이고, 다른 하나는 DataGrid의 Price 열에서 런타임 통계를 작동하는 데 사용되는 배정밀도 값입니다. .
Page_Load 이벤트
Page_Load 이벤트에서 사용자가 해야 할 일은 SQL Server에 연결하고 간단한 SqlCommand를 실행하는 것뿐입니다. 가격 값 > 0인 모든 제목 및 가격 데이터를 얻었습니다. SqlCommand.ExecuteReader 메서드를 사용하여 SqlDataReader를 반환하고 이를 DataGrid(MyGrid)에 직접 바인딩합니다.
protected void Page_Load(개체 전송자, EventArgs e) { SqlConnection myConnection = new SqlConnection("server=Localhost;database=pubs;uid=sa;pwd=;");//SQL 연결 만들기 SqlCommand myCommand = new SqlCommand("SELECT title, 가격 FROM Titles WHERE 가격 > 0", myConnection );//SQL 명령어 생성
노력하다 { myConnection.Open();//데이터베이스 연결 열기 MyGrid.DataSource = myCommand.ExecuteReader();//DataGrid의 데이터 소스 지정 MyGrid.DataBind();//DataGrid에 데이터 바인딩 myConnection.Close();//데이터 연결 닫기} catch(예외예외) { //오류를 잡아냅니다. HttpContext.Current.Response.Write(ex.ToString()); } } |
CalcTotals 메서드
CalcTotals 메소드는 runningTotal 변수를 처리하는 데 사용됩니다. 이 값은 문자열로 전달됩니다. 이를 double로 구문 분석해야 하며 그러면 runningTotal 변수가 double이 됩니다.
개인 무효 CalcTotal(문자열 _price) { 노력하다 { runningTotal += Double.Parse(_price); } 잡다 { //오류 잡기} } |
MyGrid_ItemDataBound 이벤트
MyGrid_ItemDataBound 이벤트는 데이터 소스의 각 행이 DataGrid에 바인딩될 때 호출됩니다. 이 이벤트 핸들러에서는 각 데이터 행을 처리할 수 있습니다. 여기서는 CalcTotals 메서드를 호출하고 Price 열의 텍스트를 전달하고 각 행의 Price 열에 금액 형식을 지정하고 바닥글 행에 runningTotal 값을 표시해야 합니다.
공개 무효 MyDataGrid_ItemDataBound(개체 전송자, DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { CalcTotal(e.Item.Cells[1].Text); e.Item.Cells[1].Text = string.Format("{0:c}", Convert.ToDouble(e.Item.Cells[1].Text)); } else if(e.Item.ItemType == ListItemType.Footer ) { e.Item.Cells[0].Text="전체"; e.Item.Cells[1].Text = string.Format("{0:c}", runningTotal); } } |
MyGrid_ItemDataBound 이벤트 처리기에서는 먼저 ListItemType을 사용하여 현재 DataGridItem이 데이터 항목인지 AlternatingItem 행인지 확인해야 합니다. 데이터 항목의 경우 CalcTotals를 호출하고 Price 열의 값을 매개변수로 전달한 다음 금액 형식으로 Price 열의 형식을 지정하고 색상을 지정합니다.
DataGridItem이 바닥글인 경우 runningTotal을 금액 형식으로 표시할 수 있습니다.
요약
이 가이드에서는 DataGrid.OnItemDataBound 이벤트를 사용하여 DataGrid 열에 대한 런타임 통계를 수행하는 방법을 배웠습니다. 이 이벤트를 사용하면 열 합계를 만들고 DataGrid 행의 바닥글에 색상을 지정할 수 있습니다.