Transcript

Nguồn: congdongcviet.comCăn bản crystal reports trong lập trình C#Hôm nay tui sẽ dành viết mấy bài tut cơ bản nhất về crystal reports!Đầu tiên, ta tạo 1 database nhỏ để làm việc với nó, các bạn tạo trong sqlserver 1 database có tên là example, có 3 table là OrderMaster , OrderDetails ,ProductPHP Code:USE [example] GO /****** Object:  Table [dbo].[OrderMaster]    Script Date: 09/04/2009 15:11:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[OrderMaster](     [OrderMaster_id] [int] NOT NULL,     [OrderMaster_date] [datetime] NULL,     [OrderMaster_customername] [varchar](50) NULL,     [OrderMaster_createduser] [varchar](50) NULL,  CONSTRAINT [PK_OrderMaster] PRIMARY KEY CLUSTERED  (     [OrderMaster_id] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object:  Table [dbo].[OrderDetails]    Script Date: 09/04/2009 15:11:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[OrderDetails](     [OrderDetails_id] [int] NOT NULL,     [OrderDetails_masterid] [int] NULL,     [OrderDetails_productid] [int] NULL,     [OrderDetails_qty] [int] NULL,  CONSTRAINT [PK_OrderDetails] PRIMARY KEY CLUSTERED  (     [OrderDetails_id] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object:  Table [dbo].[Product]    Script Date: 09/04/2009 15:11:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Product](     [Product_id] [int] NOT NULL,     [Product_name] [varchar](50) NULL,     [Product_price] [numeric](18, 0) NULL,  CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED  (     [Product_id] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO 

Tạo 1 project winform application trong VS.Vào menu PROJECT-->Add New Item. Chọn item là Crytal ReportHiện ra 1 bảng chọn mẫu báo cáo, ở đây tôi sẽ để mặc định

Tiếp đến là chọn kết nối tới database ( ở đây là example), tôi sử dụng OLEDB Connection để kết nối.Chọn OLEDB connection ở hôp thoại Create New Connection

Điền các thông tin kết nối vào :

Ở hộp thoại kế tiếp sẽ hiện các thông số kết nối, cứ việc FinishỞ đây tôi muốn hiện thị table Product, nên chọn table Product

Chọn các trường của table product

Chọn next và chọn các kiểu hình thức của report, cuối cùng là Finish

Đã xong bước tạo report, trên Form1 chúng ta tạo lúc nãy,kéo vô 1 cái Button và 1 cái CrystalReportViewer control,khi click vô button thì sẽ hiện ra báo cáo :PHP Code:ReportDocument cryRpt = new ReportDocument();             cryRpt.Load(@"C:\Documents and Settings\Qu@n Bom\My Documents\Visual Studio 2008\Projects\Example\Example\CrystalReport1.rpt");             crystalReportViewer1.ReportSource = cryRpt;             crystalReportViewer1.Refresh(); 

Quên, nhớ là phải using CrystalDecisions.CrystalReports.Engine;

__________________Cánh Chym đã mỏi

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555  #2  

04-09-2009, 04:08 PM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Tạo reports từ nhiều bảng

Bài trên ta đã tạo report chỉ với 1 bảng là Product, bây giờ sẽ tạo report với nhiều bảng xem sao nhé Mọi việc cũng giống như trên, đến bước chọn các table thì ta chọn cả 3 table cho nó máu , sau đấy là chọn các fields muốn report :

Mọi chuyện lại tiếp tục như thếP/s : bài hướng dẫn vẫn chưa hết nên mọng các bạn chưa hỏi ở đây, tạm thời tui sẽ lock đề tài lại để viết tiếp __________________Cánh Chym đã mỏi

Đã được chỉnh sửa lần cuối bởi dieucay555 : 04-09-2009 lúc 04:12 PM.

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555  #3  

04-09-2009, 11:27 PM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Sử dụng parameter trong crytal reportỞ bài này tôi sẽ hướng dẫn cách sử dụng String parameter.Ví dụ,bạn muốn đưa vào 1 tham số là customername,và sẽ hiện ra các đơn đặt hàng của khách hàng đó ở report.Ở đây, tui sẽ sử dụng tiếp cái report đã tạo ở bài trên.Chọn Fields Explorer (menu Crytal Reports ->Fields Explorer),chuột phải vào Parameter Fields,rồi new,điền các tham số vào :

Tôi chọn kiểu là string, các kiểu khác làm cũng tương tựSau khi tạo xong parameter, ta sẽ tạo biểu thức cho các fields,vào cửa sổ design của crytal reports rồi làm như hình :

Hiện ra 1 editor để bạn thiết kế fomular, muốn sử dụng field nào thì chọn field đó,các bạn cứ làm theo thứ tự tớ oánh số trong hình nhá

Thiết kế form như trong hình :

Bi giờ ta viết code cho sự kiện của nút showVisual C# Code:

Lựa chọn code | Ẩn/Hiện codeprivate void button1_Click(object sender, EventArgs e)        {            ReportDocument cryRpt = new ReportDocument();            cryRpt.Load(@"C:\Documents and Settings\Qu@n Bom\My Documents\Visual Studio 2008\Projects\Example\Example\CrystalReport1.rpt");

            ParameterFieldDefinitions crParameterFieldDefinitions;            ParameterFieldDefinition crParameterFieldDefinition;            ParameterValues crParameterValues = new ParameterValues();            ParameterDiscreteValue crParameterDiscreteValue = new ParameterDiscreteValue();

            crParameterDiscreteValue.Value = textBox1.Text;            crParameterFieldDefinitions = cryRpt.DataDefinition.ParameterFields;            crParameterFieldDefinition = crParameterFieldDefinitions["Customername"];            crParameterValues = crParameterFieldDefinition.CurrentValues;

            crParameterValues.Clear();            crParameterValues.Add(crParameterDiscreteValue);            crParameterFieldDefinition.ApplyCurrentValues(crParameterValues);

            crystalReportViewer1.ReportSource = cryRpt;            crystalReportViewer1.Refresh();

        }Các file đã đính kèm

Example.rar (62.3 KB, 2191 lần xem)

__________________Cánh Chym đã mỏi

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555  #4  

05-09-2009, 08:48 AM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Tạo reports từ DataSet

Mấy bài trước tui chỉ tạo report từ database, ở bài này tui sẽ tạo 1 report từ DataSet coi sao nhé .Tạo 1 project winform mới, add thêm vào 1 DataSet,giữ nguyên các thông tin mặc định của nó,trên DataSet đó ta tạo ra 1 datatable có 2 column là ID và Item :

Bây giờ ta sẽ tạo 1 report từ DataSet mới tạo ra. Vào menu Project->Add new item, chọn crytal report như mấy cái trên kia, để các thông số mặc định luôn cho tiện. Nhưng ở đây ta ko tạo ra connect tới database nào mà chọn luôn dataset lúc này :

Ở bước kế tiếp, chọn luôn cả 2 column của DataTable trên DataSet lúc nãy nhé

Bây giờ tạo thêm vào form 1 cái button và 1 crystalReportViewer control như mấy cái trước. Tui sẽ tạo dữ liệu đơn giản cho dataset và hiển thị ở report :Visual C# Code:

Lựa chọn code | Ẩn/Hiện codeprivate void button1_Click(object sender, EventArgs e)        {            DataSet1 ds = new DataSet1();            DataTable t = ds.Tables.Add("Items");            t.Columns.Add("id", Type.GetType("System.Int32"));            t.Columns.Add("Item", Type.GetType("System.String"));

            DataRow r;            int i = 0;            for (i = 0; i <= 9; i++)            {                r = t.NewRow();                r["id"] = i;                r["Item"] = "Item" + i;                t.Rows.Add(r);            }

            CrystalReport1 objRpt = new CrystalReport1();            objRpt.SetDataSource(ds.Tables[1]);            crystalReportViewer1.ReportSource = objRpt;            crystalReportViewer1.Refresh();

        }__________________Cánh Chym đã mỏi

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555  #5  

05-09-2009, 09:17 AM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Tạo reports từ Sql queryỞ bài này tui sẽ tạo report từ kết quả của các query trong Sql, vẫn sử dụng DataSet.Tui sẽ tạo report cho bảng Product trong cái database đã nói ở bài trên cùng nhé,câu truy vấn của chúng ta như sau :PHP Code:sql = "SELECT Product_id,Product_name,Product_price FROM Product"; 

Tạo mới 1 project winform và add vào 1 DataSet mới,trên DataSet đó tạo thêm 1 DataTable, và trên DataTable đó ta add 3 column vào nhá

Tuơng tự như bài vừa trên, tui sẽ tạo thêm 1 crytal report và vẫn sử dụng ProjectData :

Ở bước kế tiếp tui sẽ chọn cả 3 fields Product_id,Product_name,Product_price.Đã xong phần thiết kế reportTheo truyền thống, ta lai tạo 1 button và 1 crytalReportViewer như mấy cái trên kia nhé Visual C# Code:

Lựa chọn code | Ẩn/Hiện codeprivate void button1_Click(object sender, EventArgs e)        {            SqlConnection cnn;            string connectionString = null;            string sql = null;

            connectionString = "server=.\\sqlexpress;database=example;integrated security=true";            cnn = new SqlConnection(connectionString);            cnn.Open();            sql = "SELECT Product_id,Product_name,Product_price FROM Product";            SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn);            DataSet1 ds = new DataSet1();            dscmd.Fill(ds, "Product");            MessageBox.Show(ds.Tables[1].Rows.Count.ToString());            cnn.Close();

            CrystalReport1 objRpt = new CrystalReport1();            objRpt.SetDataSource(ds.Tables[1]);            crystalReportViewer1.ReportSource = objRpt;            crystalReportViewer1.Refresh();

        }__________________Cánh Chym đã mỏi

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555

  #6   05-09-2009, 11:20 AM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Tạo dynamic reports trong C#Mấy bài trước, chúng ta tạo report từ những database đã được chọn sẵn, bây giờ ta tạo report từ kết quả của các query SQL lúc runtime.Ta cũng tạo project winform và cũng thêm vào 1 DataSet như bài trên kia nhưng ko kết nối vào database nào cả. Trên Dataset, ta cũng thêm 1 datatable vào DataSet đó, trên Datatable ta tạo mấy cái column như sau:

Tạo thêm 1 cái crytal report như baì trước!Các bạn thực hiện như các bước ở các bài trên tớ làm, cũng sử dụng ProjectData và chọn tất cả cac column của cái Datatable vừa tạo nhá.

Bi giờ ta sẽ thiết kế 1 cài Form như bên giưới,report sẽ phụ thuộc vào cac queyry lúc runtime:

Viết 1 hàm xử lý cho các query nhập vào :Visual C# Code:

Lựa chọn code | Ẩn/Hiện codepublic string procesSQL()        {            string sql = null;            string inSql = null;            string firstPart = null;            string lastPart = null;            int selectStart = 0;            int fromStart = 0;            string[] fields = null;            string[] sep = { "," };            int i = 0;            TextObject MyText ;

            inSql = textBox1.Text;            inSql = inSql.ToUpper();

            selectStart = inSql.IndexOf("SELECT");            fromStart = inSql.IndexOf("FROM");            selectStart = selectStart + 6;            firstPart = inSql.Substring(selectStart, (fromStart - selectStart));            lastPart = inSql.Substring(fromStart, inSql.Length - fromStart);

            fields = firstPart.Split(',');            firstPart = "";            for (i = 0; i <= fields.Length - 1; i++)            {                if (i > 0)                {                    firstPart = firstPart + ", " + fields[i].ToString() + " AS COLUMN" + (i + 1);                    firstPart.Trim();

                    MyText = (TextObject) objRpt.ReportDefinition.ReportObjects[i+1];                    MyText.Text = fields[i].ToString();                }                else                {                    firstPart = firstPart + fields[i].ToString() + " AS COLUMN" + (i + 1);                    firstPart.Trim();

                    MyText = (TextObject)objRpt.ReportDefinition.ReportObjects[i+1];                    MyText.Text = fields[i].ToString();                }            }            sql = "SELECT " + firstPart + " " + lastPart;            return sql;        }Và viết code cho sư kiện của button :Visual C# Code:

Lựa chọn code | Ẩn/Hiện code private void button1_Click(object sender, EventArgs e)        {            SqlConnection cnn ;            string connectionString = null;            string sql = null;            connectionString = "data source=SERVER NAME;initial catalog=crystaldb;user id=USER NAME;password=PASSWORD;";            cnn = new SqlConnection(connectionString);            cnn.Open();            sql = procesSQL();

            SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn);            DataSet1 ds = new DataSet1();            dscmd.Fill(ds, "Product");            objRpt.SetDataSource(ds.Tables[1]);            crystalReportViewer1.ReportSource = objRpt;            crystalReportViewer1.Refresh();        }À các bạn nhớ using mấy cái namespace cần thiết nhá Còn 1 điều nữa là mọi vi dụ đều dùng database ở bài đâu,khi chạy ví dụ thì các bạn nhớ chỉnh lại chuỗi kết nối cho phù hợp Các file đã đính kèm

Example3.rar (97.9 KB, 1217 lần xem)__________________Cánh Chym đã mỏi

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555  #7  

05-09-2009, 11:49 AM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Tạo reports từ XML

Nãy giờ ta mới chỉ tạo report từ database truyền thống, giờ sẽ chơi với 1 kiểu dữ liệu hiện đại hơn là XML cho nó máu Thật ra, sự khác nhau là không nhiều, chỉ khác là khi ta design report thì lúc chọn data sẽ là XML.Các bạn tạo 1 file XML là Produc.XML :XML Code:

Lựa chọn code | Ẩn/Hiện code<?xml version="1.0" encoding="utf-8"?><DataSet1 xmlns="http://tempuri.org/DataSet1.xsd">  <Product>    <Product_ID>1</Product_ID>    <Product_Name>Product1</Product_Name>    <Product_Price>10</Product_Price>  </Product>  <Product>    <Product_ID>2</Product_ID>    <Product_Name>Product2</Product_Name>    <Product_Price>12</Product_Price>  </Product>  <Product>    <Product_ID>3</Product_ID>    <Product_Name>Product3</Product_Name>    <Product_Price>15</Product_Price>  </Product>  <Product>    <Product_ID>4</Product_ID>    <Product_Name>Product4</Product_Name>    <Product_Price>5</Product_Price>  </Product>  <Product>    <Product_ID>5</Product_ID>    <Product_Name>Product5</Product_Name>    <Product_Price>7</Product_Price>  </Product></DataSet1>Khi design report, ta sẽ chọn Create new connection->ADO.NET rồi chọn đến file XML này nhá, công việc còn lại ko khác gì bài đầu tiên :

__________________Cánh Chym đã mỏi

dieucay555

Xem Hồ sơ công khaiGửi một tin nhắn tới dieucay555Tìm toàn bộ bài viết bởi dieucay555  #8  

05-09-2009, 12:24 PM

dieucay555 Anonymous Member  

Ngày gia nhập: 11 2007Nơi ở: Biết để làm gì?Bài viết: 950

Xuất kết quả report ra Excel,PDFĐọc mấy bài ở trên các bạn chắc đã nắm đc sơ sơ về crytal report rùi, giờ nói thêm về việc trích xuất ra các định dạng của Excel hoặc PDFCác bạn cỏ thể sử dụng ExportOptions để tùy chỉnh các định dạng trích xuấtQuay lại bài đầu tiên, ta thêm 2 cái button nữa,sau khi đã tạo và hiển thị thành công report, ta có thể export ra pdf hoặc excelĐây là export ra 1 file excel (file test.xls sẽ dc tạo ở ổ C)Visual C# Code:

Lựa chọn code | Ẩn/Hiện codetry            {                ExportOptions CrExportOptions;

                DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();                ExcelFormatOptions CrFormatTypeOptions = new ExcelFormatOptions();                CrDiskFileDestinationOptions.DiskFileName = "c:\\test.xls";                CrExportOptions = cryRpt.ExportOptions;                CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;                CrExportOptions.ExportFormatType = ExportFormatType.Excel;                CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions;                CrExportOptions.FormatOptions = CrFormatTypeOptions;                cryRpt.Export();            }            catch (Exception ex)            {                MessageBox.Show(ex.ToString());            }Export ra pdf :Visual C# Code:

Lựa chọn code | Ẩn/Hiện codetry            {                ExportOptions CrExportOptions;                DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();                PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions();                CrDiskFileDestinationOptions.DiskFileName = "C:\\test.pdf";                CrExportOptions = cryRpt.ExportOptions;                {                    CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;                    CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;                    CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions;                    CrExportOptions.FormatOptions = CrFormatTypeOptions;                }                cryRpt.Export();            }            catch (Exception ex)            {

                MessageBox.Show(ex.ToString());            }À, nhớ PHP Code:using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared; 

[C#]Hướng dẫn tạo Crystal Reports bằng   Dataset   Tỷ lệ bầu chọn

Giới thiệuHiện tại có rất ít bài tiếng việt hướng dẫn về phần này.

” creating Crystal Reports using C#.NET” .Tạo một Crystal Reports trong C#.Net với CSDL accessSQL sercer làm tương tự.

Tạo datasetĐầu tiên bạn tạo 1 dự ánSau đó

“Add New Item” trong “Project” menu, bạn add a DatasetGiống hình bên dưới.

Nguồn bài viết: http://sinhvienit.net/@forum/showthread.php?t=16748

Giới thiệuHiện tại có rất ít bài tiếng việt hướng dẫn về phần này.

” creating Crystal Reports using C#.NET” .Tạo một Crystal Reports trong C#.Net với CSDL accessSQL sercer làm tương tự.

Tạo dataset

Đầu tiên bạn tạo 1 dự ánSau đó

“Add New Item” trong “Project” menu, bạn add a DatasetGiống hình bên dưới.

Code:String connString = @"Provider=Microsoft.Jet.OLEDB.4.0;_ Data Source=..\\..\\myDB.mdb;User ID=Admin;Password=";

OleDbConnection conn = new OleDbConnection(connString);conn.Open();string query = "SELECT studentID, firstName, lastName, birthDate, _ address, contactNo FROM studentInfo";OleDbDataAdapter oleDA = new OleDbDataAdapter(query,conn);

Tạo một báo cáo dùng Crystal ReportsSau khi tao xong dataset bạn add a Crystal Report vào project bằng cách “Add New Item” trong “Project” menu. Sau đó chọn tên xuất hiện rồi nhấn nút ok.

Màn hình sẽ hiển thị như sau bạn chọn mặt định rồi ấn OKSau đó chọn table rùi insert tablephần này có thể khác so với VB2005 nhưng cũng tương tự thôi!

sau đó chọn các fields hiển thị trong report –> nhần nút add

Xong xu bạn nhấn nút next–>cuối cùng chọn style kiểu bạn muốn report hiển thị

Kế tiếp bạn sẽ cho report hiển thị trên form

Bạn tao một form và add crystalReportViewerviết code trong thuộc tính page load

Code:// code to get data from the DBDBConnection DBConn = new DBConnection();OleDbDataAdapter myDataAdapter = DBConn.getDataFromDB();

// use the created Dataset to fill it with data got// from the DB by using the DataAdapterDataSet dataReport = new DataSet();myDataAdapter.Fill(dataReport,"myPersonalInfoTable ");// create a new report from the created CrystalReportmyDataReport myDataReport = new myDataReport();

// set the data source of the reportmyDataReport.SetDataSource(dataReport);

// set the report source of the created “crystalReportViewer”// component to the created reportcrystalReportViewer1.ReportSource = myDataReport;

bạn có thể thay đổi dường dẫn mặt định bằng

Code:

crystalReportViewer1.ReportSource = @“..\Reports\salesReport.rpt”;

Xem trước một báo cáo với Window Form

Sau khi đã tạo một bản báo cáo trong bài trước (Bài 1) , giờ bạn có thể xem nó sử dụng cả Window Form hoặc ASP.NET . Trong bài này chỉ hướng dẫn để xem nó trong một Window Form mà thôi …Giờ ta sẽ sửa đổi 1 Form để có thể xem được báo cáo mà chúng ta đã tạo . Khi bạn tạo một project mới thì một Form tên là Form1 luôn được gán đến project của bạn . Giờ bạn hãy mở design của Form này lên và thêm vào đó control CrystalReportViewer .

Với control này bạn có nhiều cách để xem trước một báo cáo . Trong ví dụ này ta sẽ sử dụng thành phần (component) ReportDocument bởi vì nó dễ dàng để lựa chọn . Bạn thêm thành phần component ReportDocument đến form bằng cách double – clicking vào nó từ Toolbox . Sau đó bạn click phải chuột vào Form của bạn (click vào control CrystalReportViewer mà ta đã kéo vào) chọn Choose a Crystal Report . Một cửa sổ mới sẽ hiện ra trong hình

Trong cửa sổ này khi bạn sẽ chọn báo cáo cho Form của bạn .Giờ bạn đã có thể xem kết quả của mình bằng cách chạy thử Form vừa tạo … và đây là kết quả của mình .

Hình ảnh này đã bị thay đổi kích thước nhằm tránh làm vỡ giao diện. Bấm vào đây để xem ảnh ở kích thước đầy đủ ( 1019×736 )


Top Related