การใช้ตัวควบคุม ReportViewer ใน ASP.NET 2.0
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-07-01 16:43:40
การแปลบทความนี้: webabcd
แนะนำ
มีการรายงานข้อกำหนดทั่วไปสำหรับแอปพลิเคชันที่ขับเคลื่อนด้วยข้อมูล อย่างไรก็ตาม คุณลักษณะที่สำคัญมากนี้ไม่ได้จัดเตรียมไว้ให้เราใน ASP.NET 1.x อย่างไรก็ตาม โชคดีที่ตัวควบคุม ReportViewer ที่มาพร้อมกับ .NET 2.0 สามารถตอบสนองความต้องการพื้นฐานบางประการสำหรับรายงานของคุณได้ ฉันจะแสดงวิธีใช้การควบคุมนี้ในบทความนี้ การควบคุม ReportViewer สามารถใช้ได้ทั้งในโปรแกรมเว็บและโปรแกรม Windows ในที่นี้ผมจะแนะนำวิธีการใช้งานในโปรแกรมเว็บเท่านั้น
ตัวอย่างรายงาน
เราถือว่าเราต้องการสร้างรายการข้อมูลลูกค้าดังที่แสดงด้านล่าง:
รายงานด้านบนเป็นรายการข้อมูลลูกค้าแบบง่ายๆ ที่จัดกลุ่มตามประเทศ ข้อมูลสำหรับรายงานได้มาจากตารางลูกค้าของฐานข้อมูล Northwind โดยค่าเริ่มต้น จะแสดงข้อมูลลูกค้าทั้งหมด อย่างไรก็ตาม คุณยังสามารถให้แสดงข้อมูลเกี่ยวกับลูกค้าที่อยู่ในประเทศที่คุณระบุได้
รายงานได้รับการออกแบบโดยใช้ตัวควบคุม ReportViewer ซึ่งสามารถรับข้อมูลจากชุดข้อมูลที่พิมพ์อย่างยิ่งหรือคอลเลกชันออบเจ็กต์ที่กำหนดเอง ในการพัฒนาโปรแกรมจริง เรามักจะใช้สถาปัตยกรรมสามชั้น และข้อมูลที่ได้รับมักจะเป็นชุดข้อมูลหรือคอลเลกชันทั่วไปที่ได้รับจากชั้นธุรกิจ ที่นี่ ฉันวางแผนที่จะใช้คอลเลกชันทั่วไปเป็นแหล่งข้อมูลแทนชุดข้อมูลที่พิมพ์อย่างยิ่ง
สร้างห้องสมุดชั้นเรียน
ขั้นแรก เปิด Visual Studio และสร้างโครงการไลบรารีคลาสชื่อ ReportViewerLib เพิ่มคลาสชื่อลูกค้าตามที่แสดงด้านล่าง:
ใช้ระบบ; ใช้ System.Data; โดยใช้ระบบการกำหนดค่า; โดยใช้ System.Data.SqlClient; ใช้ System.Collections.Generic; เนมสเปซ ReportViewerLib - คลาสสาธารณะลูกค้า - สตริงสาธารณะ strCustomerID; สตริงสาธารณะ strCompanyName; สตริงสาธารณะ strContactName; สตริงสาธารณะ strCountry;
สตริงสาธารณะ CustomerID - รับ - กลับ strCustomerID; - ชุด - strCustomerID = ค่า; - -
CompanyName สตริงสาธารณะ - รับ - กลับ strCompanyName; - ชุด - strCompanyName= ค่า; - -
ContactName สตริงสาธารณะ - รับ - กลับ strContactName; - ชุด - strContactName= ค่า; - -
ประเทศสตริงสาธารณะ - รับ - กลับ strCountry; - ชุด - strCountry= ค่า; - -
รายการคงที่สาธารณะ |
GetCustomersForCountry (ประเทศสตริง) - SqlConnection cnn=การเชื่อมต่อ Sql ใหม่ ( ConfigurationManager.ConnectionStrings ["NorthwindConnectionString"].ConnectionString); SqlCommand cmd=ใหม่ SqlCommand(); cmd.Connection=cnn; cmd.CommandText="เลือก รหัสลูกค้า ชื่อบริษัท ชื่อผู้ติดต่อ ประเทศ จากลูกค้าที่ Country=@country"; SqlParameter p=SqlParameter ใหม่ ("@ประเทศ",ประเทศ); cmd.Parameters.Add(p); cnn.เปิด(); เครื่องอ่าน SqlDataReader = cmd.ExecuteReader(); รายการ |
- ในขณะที่ (reader.Read()) - ลูกค้า c = ลูกค้าใหม่ (); c.CustomerID = reader.GetString(0); c.CompanyName = reader.GetString(1); c.ContactName = reader.GetString(2); c.ประเทศ = reader.GetString(3); รายการ.เพิ่ม(c); - cnn.ปิด(); รายการส่งคืน; -
รายการคงที่สาธารณะ |
รับลูกค้าทั้งหมด() - SqlConnection cnn = SqlConnection ใหม่ ( ConfigurationManager.ConnectionStrings ["NorthwindConnectionString"].ConnectionString); SqlCommand cmd = SqlCommand ใหม่(); cmd.Connection = CNN; cmd.CommandText = "เลือก รหัสลูกค้า,ชื่อบริษัท,ชื่อผู้ติดต่อ,ประเทศจากลูกค้า"; cnn.เปิด(); เครื่องอ่าน SqlDataReader = cmd.ExecuteReader(); รายการ |
- ในขณะที่ (reader.Read()) - ลูกค้า c = ลูกค้าใหม่ (); c.CustomerID = reader.GetString(0); c.CompanyName = reader.GetString(1); c.ContactName = reader.GetString(2); c.ประเทศ = reader.GetString(3); รายการเพิ่ม(c); - cnn.ปิด(); รายการส่งคืน; -
- -
|
คลาสลูกค้ากำหนดคุณสมบัติสาธารณะสี่ประการ ได้แก่ CustomerID, CompanyName, ContactName และ Country หลังจากนั้น มีวิธีการคงที่สองวิธีที่มีอยู่ในคลาสนี้ – GetCustomersForContry() และ GetAllCustomers() สองวิธีนี้ค่อนข้างง่าย วิธีหนึ่งส่งคืนข้อมูลลูกค้าทั้งหมดที่เป็นของประเทศใดประเทศหนึ่ง และอีกวิธีส่งคืนข้อมูลลูกค้าทั้งหมด ขั้นแรกให้เปิดการเชื่อมต่อกับฐานข้อมูล Northwind จากนั้นดำเนินการแบบสอบถาม SELECT ผ่านวัตถุ SqlCommand หลังจากนั้น ให้ใช้วัตถุ SqlDataReader เพื่อรับข้อมูล สำรวจวัตถุ SqlDataReader นี้ สร้างวัตถุลูกค้าทุกครั้งที่อยู่ภายใน จากนั้นตั้งค่าคุณสมบัติต่างๆ และสุดท้ายเพิ่มลงในคอลเลกชันทั่วไปของวัตถุลูกค้า เมื่อสิ้นสุดคลาส คอลเลกชันทั่วไปของออบเจ็กต์ลูกค้าจะถูกส่งกลับไปยังผู้เรียก
สร้างแหล่งข้อมูล
เมื่อออกแบบรายงาน คุณต้องระบุแหล่งข้อมูลในโครงการของคุณ หากต้องการเพิ่มแหล่งข้อมูลในโครงการของคุณ คุณสามารถทำได้โดยเลือกเมนูข้อมูล -> เพิ่มแหล่งข้อมูลใหม่ จากนั้นกล่องโต้ตอบที่แสดงด้านล่างจะปรากฏขึ้น:
แหล่งข้อมูลของคุณอาจเป็นฐานข้อมูล บริการเว็บ หรือออบเจ็กต์ ในกรณีนี้เราเลือกวัตถุ จากนั้นคลิกปุ่ม "ถัดไป" จากนั้นอินเทอร์เฟซสำหรับให้เราเลือกแหล่งข้อมูลจะปรากฏขึ้น เราเลือกระดับลูกค้า (ดังแสดงในรูปด้านล่าง)
คลิกปุ่ม "เสร็จสิ้น" เพื่อดำเนินการวิซาร์ดการกำหนดค่าแหล่งข้อมูลให้เสร็จสิ้น ด้วยวิธีนี้ คุณได้เพิ่มแหล่งข้อมูลใหม่ลงในไลบรารีชั้นเรียนของคุณ หากคุณต้องการดูแหล่งข้อมูล คุณสามารถทำได้ เลือกเมนู "ข้อมูล" -> แสดงแหล่งข้อมูล และอินเทอร์เฟซดังที่แสดงด้านล่างจะปรากฏขึ้น:
รายงานการออกแบบ
ถัดไปเพิ่มรายงาน คลิกขวาที่โครงการและเลือก "เพิ่มรายการใหม่" เลือก "รายงาน" ในกล่องโต้ตอบแล้วคลิกปุ่ม "เพิ่ม" (ดังแสดงในรูปด้านล่าง) ด้วยวิธีนี้ เราได้เพิ่มไฟล์ชื่อ "Report1.rdlc" ไฟล์ .rdlc เป็นไฟล์รายงาน ซึ่งจะบันทึกเค้าโครงรายงานและการแมปข้อมูล
เมื่อคุณเปิดไฟล์ Report1.rdlc ชุดของตัวควบคุมที่เกี่ยวข้องกับรายงานจะแสดงในกล่องเครื่องมือ Visual Studio (ดังแสดงด้านล่าง)
ในบรรดาตัวควบคุมเหล่านี้ ตัวควบคุม "กล่องข้อความ" และตัวควบคุม "ตาราง" มักใช้กันมาก ตัวควบคุม "กล่องข้อความ" ใช้เพื่อแสดงข้อความคงที่หรือนิพจน์ ตัวควบคุม "ตาราง" ใช้เพื่อแสดงข้อมูลแบบตาราง และผลลัพธ์ที่สร้างขึ้นจะแสดงใน "เนื้อหา" ของรายงานของคุณ
รายงานที่ออกแบบแสดงไว้ด้านล่าง:
ที่ส่วนหัวของส่วน "ส่วนหัว" ของรายงาน จะมีกล่องข้อความที่มีคุณสมบัติมูลค่าเป็น "รายชื่อลูกค้า" มีกล่องข้อความอื่นอยู่ใต้กล่องข้อความนี้ และค่าของคุณสมบัติ Value คือ "=Parameters!SubTitle.Value" ความหมายก็คือ ค่าของกล่องข้อความมาจากพารามิเตอร์ชื่อ SubTitle เราจะกำหนดพารามิเตอร์ได้อย่างไร สิ่งนี้จำเป็นต้องเพิ่มพารามิเตอร์ในคุณสมบัติ ReportParameters ของรายงาน กล่องโต้ตอบพารามิเตอร์รายงานที่เปิดอยู่จะแสดงในรูปด้านล่าง:
โปรดทราบ: การตั้งค่าพารามิเตอร์เสร็จสิ้นในโค้ด .NET ของเรา
หากคุณต้องการแสดงวันที่ในรายงาน เพียงตั้งค่าคุณสมบัติ Value ของกล่องข้อความที่เกี่ยวข้องเป็น "=FormatDateTime(ToDay(),DateFormat.ShortDate)" ข้อดีอย่างหนึ่งของรายงานก็คือมีฟังก์ชันในตัวมากมาย เช่น ToDay() และ FormatDateTime ในตัวอย่างนี้ เราใช้ฟังก์ชัน FormatDateTime() เพื่อแสดงวันที่ปัจจุบัน (ToDay()) ในรูปแบบ ShortDate
ตอนนี้ ลากตัวควบคุม "ตาราง" จากกล่องเครื่องมือไปยังรายงานของคุณ ตามค่าเริ่มต้น ตัวควบคุม "ตาราง" มี 3 แถวและ 3 คอลัมน์ โดยทั้ง 3 แถวได้แก่ ส่วนหัวของตาราง ข้อมูลโดยละเอียด และส่วนท้ายของตาราง แน่นอน คุณยังสามารถเพิ่มแถวและคอลัมน์ลงในตัวควบคุมตารางได้ ลากคุณสมบัติ CustomerID, CompanyName, ContactName และ Country จากหน้าต่างแหล่งข้อมูลไปยังแถวรายละเอียดของตัวควบคุม Table ของคุณ ด้วยวิธีนี้ ระบบจะเพิ่มกล่องข้อความโดยอัตโนมัติและตั้งค่าคุณสมบัติเป็น =Fields!CustomerID.Value, =Fields!CompanyName.Value และอื่นๆ ณ จุดนี้ ส่วนหัวของคอลัมน์จะถูกเพิ่มโดยอัตโนมัติด้วย แน่นอน คุณยังสามารถทำการปรับเปลี่ยนตามที่คุณต้องการได้ตามความต้องการของคุณ
ต่อไป เราต้องการจัดกลุ่มเรกคอร์ดตามประเทศที่ลูกค้าอยู่ คลิกขวาที่ขอบของแถวรายละเอียดแล้วเลือกแทรกกลุ่ม (ดังแสดงในภาพด้านล่าง)
จากนั้นกล่องโต้ตอบที่แสดงด้านล่างจะปรากฏขึ้น:
ในแท็บ "เรียงลำดับ" ให้เลือก "=Fields!Country.Value" เป็นนิพจน์ และเลือก "จากน้อยไปหามาก" เป็นทิศทางการเรียงลำดับ
สิ่งเหล่านี้คือสิ่งที่ง่ายมาก ด้วยวิธีนี้ เราได้เสร็จสิ้นการออกแบบรายงานแล้ว
แสดงรายงาน
สร้างเว็บไซต์ใหม่ชื่อ "ReportViewerDemo" เพิ่มการอ้างอิงไปยังแอสเซมบลี ReportViewerLib เพื่อให้แอสเซมบลีจะถูกคัดลอกไปยังไดเรกทอรี BIN ของเว็บไซต์ของคุณ หลังจากนั้น เพิ่มไฟล์ Report1.rdlc ไปยังเว็บไซต์ของคุณ ลากตัวควบคุม ReportViewer ในแท็บ "ข้อมูล" ของกล่องเครื่องมือไปยังเพจ Default.aspx ของคุณ เปิดแผงสมาร์ทแท็กของตัวควบคุม ReportViewer และเลือก Report1.rdlc ในกล่องแบบเลื่อนลง "เลือกรายงาน" ดังที่แสดงใน รูปด้านล่าง:
หลังจากเลือกไฟล์รายงาน ระบบจะเพิ่มตัวควบคุมแหล่งข้อมูลออบเจ็กต์ที่มีคุณสมบัติ TypeName เป็นลูกค้าโดยอัตโนมัติ คุณสามารถตรวจสอบสิ่งนี้ได้ในตัวช่วยสร้างการกำหนดค่าของการควบคุมแหล่งข้อมูลออบเจ็กต์
ถัดไป ลากตัวควบคุม DropDownList ไปที่ส่วนหัวของหน้าและตั้งค่าตัวเลือกสี่ตัวเลือก ได้แก่ ทั้งหมด สหรัฐอเมริกา สหราชอาณาจักร และบราซิล ตั้งค่าคุณสมบัติ AutoPostBack เป็น True ด้วย จากนั้น เปิดตัวช่วยสร้างการตั้งค่าคอนฟิกของตัวควบคุมแหล่งข้อมูล และตั้งค่าการดำเนินการ "SELECT" เป็นเมธอด SelectCustomersForCountry()
ตั้งค่าพารามิเตอร์ประเทศของวิธีการ SelectCustomersForCountry() เป็น SelectedValue ของ DropDownList1
ตามค่าเริ่มต้น ข้อมูลลูกค้าทั้งหมดจะแสดงในรายงาน เมื่อคุณเลือกประเทศใน DropDownList ข้อมูลลูกค้าที่เป็นของประเทศที่คุณเลือกจะแสดงในรายงาน เพื่อให้ฟังก์ชันดังกล่าวสมบูรณ์ เราจำเป็นต้องจัดการเหตุการณ์ SelectedIndexChanged ของ DropDownList เท่านั้น
ป้องกันโมฆะ DropDownList1_SelectedIndexChanged (ผู้ส่งวัตถุ EventArgs e) - ถ้า (DropDownList1.SelectedValue == "ทั้งหมด") - ObjectDataSource1.SelectMethod = "GetAllCustomers"; ObjectDataSource1.SelectParameters.Clear(); พารามิเตอร์ ReportParameter = พารามิเตอร์ Report ใหม่ ("หัวข้อย่อย", "รายชื่อลูกค้าทั้งหมด"); พารามิเตอร์รายงาน [] p ={ พารามิเตอร์ }; ReportViewer1.LocalReport.SetParameters(p); - อื่น - ObjectDataSource1.SelectMethod = "GetCustomersForCountry"; ObjectDataSource1.SelectParameters[0].DefaultValue = DropDownList1.SelectedValue;
พารามิเตอร์ ReportParameter = พารามิเตอร์ Report ใหม่ ("คำบรรยาย", "รายชื่อลูกค้าสำหรับประเทศ"); พารามิเตอร์รายงาน [] p ={ พารามิเตอร์ }; ReportViewer1.LocalReport.SetParameters(p); - - |
รหัสนี้จะตรวจสอบคุณสมบัติ SelectedValue ของตัวควบคุม DropDownList ก่อน ถ้าเป็น "ทั้งหมด" ให้ตั้งค่าคุณสมบัติ SelectMethod ของตัวควบคุมแหล่งข้อมูลเป็น GetAllCustomers นอกจากนี้ เรายังจำเป็นต้องล้างคอลเลกชัน SelectParameters เนื่องจากเมธอด GetAllCustomers() ไม่ต้องการพารามิเตอร์ใดๆ ต่อไป เราสร้างอินสแตนซ์ของคลาส ReportParameter และตั้งชื่อพารามิเตอร์ของรายงานและค่าในตัวสร้าง เรียกคืนพารามิเตอร์ที่เรากำหนดไว้เมื่อออกแบบรายงาน จากนั้นสร้างอาร์เรย์ ReportParameter เรียกเมธอด SetParameters() โดยมีอาร์เรย์นี้เป็นพารามิเตอร์ บล็อกโค้ด "else" นั้นง่ายมากเช่นกัน กล่าวคือ วิธีการที่ใช้จะกลายเป็น GetCustomersForCountry()
สิ่งเหล่านี้คือสิ่งที่ง่ายมาก รายงานเสร็จสิ้นแล้ว คุณสามารถเรียกใช้เพจ Default.aspx เพื่อดูผลกระทบได้ โปรดทราบว่าตัวควบคุม ReportViewer มีคุณสมบัติการส่งออกในตัว ซึ่งช่วยให้คุณสามารถส่งออกรายงานเป็นรูปแบบ Excel หรือ PDF ได้ ตัวควบคุม ReportViewer ยังมีคุณสมบัติมากมาย คุณสามารถสำรวจได้ด้วยตัวเอง
สรุป
การควบคุม ReportViewer ของ ASP.NET มีฟังก์ชันพื้นฐานมากมายของรายงาน ในบทความนี้ เราใช้การควบคุมแหล่งข้อมูลออบเจ็กต์เพื่อพัฒนารายงาน เราสร้างไลบรารีคลาสและแหล่งข้อมูล สุดท้าย ใช้ตัวควบคุม ReportViewer เพื่อแสดงรายงาน