Lập trình động khâu thiết kế GridControl thuộc DevExpress

Lập trình động khâu thiết kế GridControl thuộc DevExpress

Ngôn ngữ lập trình: C#

 

Vấn đề thế này:

Đây là 1 cái form đơn giản gồm 2 RadioButton loại trừ nhau và 1 GridControl thuộc devexpress 11.1.

Khi ta chọn radiobutton Sinh viên, Gridcontrol sẽ hiển thị như sau:

clip_image001

Và ngược lại:

clip_image002

Và khi mở rộng:

clip_image003

Vấn đề chỉ đơn giản là lúc thì GridControl dạng đơn giản, lúc thì có cấu trúc Master-Detail.

Để xử lý vấn đề trên, tôi sẽ sử dụng phương pháp lập trình động khâu thiết kế GridControl.

Tuy nhiên, phương pháp này không phải là cách duy nhất để xử lý vấn đề trên.

Chúng ta bắt đầu,

Cơ sở dữ liệu như sau:

clip_image004

SQL:

create table khoa

(

      makhoa char(4),

      tenkhoa nvarchar(100),

      primary key (makhoa)

)

create table sinhvien

(

      mssv char(11),

      hoten nvarchar(100),

      makhoa char(4),

      primary key (mssv),

      foreign key (makhoa) references khoa(makhoa)

)

Tôi cũng áp dụng mô hình 3 lớp.

Lớp xử lý bảng thì không cần nói nhiều rồi.

Lớp xử lý nghiệp vụ: theo như yêu cầu, có 2 kết quả hiển thị cho người dùng:

·         Một là hiển thị thông tin tất cả sinh viên.

·         Hai là hiển thị thông tin tất cả các khoa, danh sách sinh viên ứng với mỗi khoa.

Gói gọn 2 phương thức như sau:

 

        public DataTable GetSinhVien()

        {

            SQLString = "select * from SinhVien";

            Commandtype = CommandType.Text;

            return GetDataTable();

        }

        public DataSet GetKhoa()

        {

            SQLString = "select * from Khoa";

            Commandtype = CommandType.Text;

            DataTable dtKhoa = GetDataTable();

            SQLString = "select * from SinhVien";

            Commandtype = CommandType.Text;

            DataTable dtSinhVien = GetDataTable();

           

            DataSet dts = new DataSet();

            dts.Tables.Add(dtKhoa);

            dts.Tables.Add(dtSinhVien);

            dts.Relations.Add(new DataRelation("Danh sách sinh viên", dtKhoa.Columns[0], dtSinhVien.Columns[2]));

            return dts;

        }

 

Lưu ý: vì ý đồ để GridControl hiển thị dạng Master-Detail nên phương thức lấy thông tin khoa sẽ trả về 1 DataSet với cấu trúc:

·         Table thứ 0 :  danh sách thông tin các khoa.

·         Table thứ 1 : danh sách thông tin các sinh viên (trong trường hợp này viết GetSinhVien() cũng ok).

·         Relation thứ 0 : quan hệ tên “danh sách sinh viên” móc giữa cột MaKhoa (cột thứ 0) bên bảng Khoa và MaKhoa (cột thứ 2) bên bảng sinh viên.

 

Lớp Form:  Sau khi kéo thả 2 radiobutton và gridcontrol vào form. Thông thường để thiết kế GridControl, ta vào Run Designer. Nhưng ở đây, tôi sẽ dùng code để xử lý.

Yêu cầu có 2 công việc : xem thông tin sinh viên và xem thông tin khoa. Mỗi công việc, tôi sẽ chia tiếp thành 2 giai đoạn. Giai đoạn định dạng thiết kế GridControl và giai đoạn đổ dữ liệu vào GridControl để hiển thị.

Đầu tiên, đơn giản nhất là xem thông tin sinh viên:

 

        private void FormatGrid_SinhVien()

        {

            gridView1.Columns.Clear();

            string[] fields = { "mssv", "hoten", "makhoa" };

            string[] captions = { "Mã số", "Họ tên", "Mã khoa" };

            for (int i = 0; i < fields.Length; i++)

            {

                DevExpress.XtraGrid.Columns.GridColumn col = new DevExpress.XtraGrid.Columns.GridColumn();

                col.FieldName = fields[i];

                col.Caption = captions[i];

                gridView1.Columns.Add(col);

                gridView1.Columns[i].Visible = true;

            }

        }

 

        private void FillGrid_SinhVien()

        {

            gridControl1.DataSource = clssForm1.GetSinhVien();

            gridControl1.ForceInitialize();

        }

FormatGrid_SinhVien đơn giản là thực hiện công việc thêm từng cột vào GridView1 có trong GridControl. Tương đương với công việc thêm cột khi Run Designer.

clip_image006

 

Còn xem thông tin khoa thì thực hiện như sau:

 

        private void FormatGrid_Khoa()

        {

            gridView1.Columns.Clear();

            string[] fields = { "makhoa", "tenkhoa"};

            string[] captions = { "Mã khoa", "Tên khoa"};

            for (int i = 0; i < fields.Length; i++)

            {

                DevExpress.XtraGrid.Columns.GridColumn col = new DevExpress.XtraGrid.Columns.GridColumn();

                col.FieldName = fields[i];

                col.Caption = captions[i];

                gridView1.Columns.Add(col);

                gridView1.Columns[i].Visible = true;

            }

            DevExpress.XtraGrid.Views.Grid.GridView gridViewDetail = new DevExpress.XtraGrid.Views.Grid.GridView();

            gridViewDetail.GridControl = gridControl1;

            string[] detail_fields = { "mssv", "hoten" };

            string[] detail_captions = { "Mã số", "Họ tên" };

            for (int i = 0; i < detail_fields.Length; i++)

            {

                DevExpress.XtraGrid.Columns.GridColumn col = new DevExpress.XtraGrid.Columns.GridColumn();

                col.FieldName = detail_fields[i];

                col.Caption = detail_captions[i];

                gridViewDetail.Columns.Add(col);

                gridViewDetail.Columns[i].Visible = true;

            }

            if (gridControl1.ViewCollection.Count > 1)

                gridControl1.ViewCollection.RemoveAt(1); //loại bỏ cái cũ

            gridControl1.ViewCollection.Add(gridViewDetail);

 

            DevExpress.XtraGrid.GridLevelNode gridLevelNodeDetail = new DevExpress.XtraGrid.GridLevelNode();

            gridLevelNodeDetail.LevelTemplate = gridViewDetail;

            gridLevelNodeDetail.RelationName = "Danh sách sinh viên";

            if (gridControl1.LevelTree.Nodes.Contains("Danh sách sinh viên"))

                gridControl1.LevelTree.Nodes.RemoveAt(0); //loại bỏ cái cũ

            gridControl1.LevelTree.Nodes.Add(gridLevelNodeDetail);

        }

 

        private void FillGrid_Khoa()

        {

            gridControl1.DataSource = clssForm1.GetKhoa().Tables[0];

            gridControl1.ForceInitialize();

        }

 

Để được cấu trúc Master-Detail thì ngoài gridview1 có sẵn khi tạo mới 1 gridcontrol, ta cần 1 gridview khác. Tôi đặt tên là gridViewDetail. Ta cũng tiến hành thêm cột cho gridViewDetail. Và sau đó thêm vào ViewCollection của GridControl. Để tạo cấu trúc phân cấp thì ta có thể thực hiện tạo một đối tượng kiểu GridLevelNode, thiết lập 1 số thuộc tính rồi lại thêm vào LevelTree.Nodes của GridControl.

Gọi hàm trong sự kiện CheckedChanged của RadioButton và FormLoad nữa là xong:

 

        private void radCheckedChanged(object sender, EventArgs e)

        {

            if (radSinhVien.Checked)

            {

                FormatGrid_SinhVien();

                FillGrid_SinhVien();

            }

            else

            {

                FormatGrid_Khoa();

                FillGrid_Khoa();

            }

        }

One response to “Lập trình động khâu thiết kế GridControl thuộc DevExpress

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s