• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Đơn giản hóa định dạng DataGridView

Bộ sưu tập các thư viện hỗ trợ sẳn cho Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Nội qui chuyên mục
1. Gửi bài viết tại đây, Tester sẽ chuyển vào trong nếu bài viết đạt yêu cầu.
2. Gửi bài theo mẫu qui định: viewtopic.php?f=2&t=5
[ten][/ten]
[loai][/loai]
[ngonngu][/ngonngu]
[tacgia][/tacgia]
[chucnang][/chucnang]
[end][/end]
Hình đại diện của người dùng
thuccads
Thành viên tích cực
Thành viên tích cực
Bài viết: 143
Ngày tham gia: T.Hai 01/02/2010 8:35 am
Đến từ: Hà Nội--->Sài Gòn
Been thanked: 1 time
Liên hệ:

Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi thuccads » T.Bảy 15/05/2010 2:15 pm

Tên: T2Grid21
Loại: UserControl
Ngôn ngữ lập trình: VB.NET
Tác giả: thuccads
Chức năng: Giữ nguyên định dạng ban đầu cho grid
-Khi thao tác với CSDL chắc chắn chúng ta không tránh khỏi làm việc với Grid, một điều khá mất công là sau khi gán datasource phải xử lý các công việc như : căn chỉnh độ rộng các cột, HeaderText, xem cột nào cần ẩn hoặc hiện....
-Nếu ta thiết lập các cột ngay trong giao diện thiết kế thì có vẻ đơn giản hơn, có điều sau khi gán datasource thì grid vẫn giữ các cột ta thêm khi thiết kế cộng với tất cả các trường đã truy vấn :( .
Vì vậy tôi giới thiệu cách : giữ nguyên hình dạng khi thiết kế (độ rộng các cột, HeaderText, nếu cột nào không thêm thì coi như ẩn luôn...
Đầu tiên ta tạo một datatable lưu trữ thông tin cấu hình ban đầu với các cột tương ứng là các thông tin cần lưu, các dòng để lưu giá trị. Code như sau :
  1.     Private mdtCaptions As DataTable
  2.  
  3.     Public Function DefineCaption() As DataTable
  4.         Try
  5.             Me.mdtCaptions = New DataTable
  6.             Me.mdtCaptions.Columns.Add("Index", GetType(Integer))
  7.             Me.mdtCaptions.Columns.Add("Name", GetType(String))
  8.             Me.mdtCaptions.Columns.Add("HeaderText", GetType(String))
  9.             Me.mdtCaptions.Columns.Add("Visible", GetType(Boolean))
  10.             Me.mdtCaptions.Columns.Add("Width", GetType(Integer))
  11.             'Nếu thêm các thuộc tính khác thì viết tiếp ở đây.
  12.             Dim num2 As Integer = (Me.Columns.Count - 1)
  13.             Dim i As Integer = 0
  14.             Do While (i <= num2)
  15.                 If (Me.Columns(i).Name <> "") Then
  16.                     Dim row As DataRow = Me.mdtCaptions.NewRow
  17.                     row.Item("Index") = i
  18.                     row.Item("Name") = Me.Columns(i).Name
  19.                     row.Item("HeaderText") = Me.Columns(i).HeaderText
  20.                     row.Item("Visible") = Me.Columns(i).Visible
  21.                     row.Item("Width") = Me.Columns(i).Width
  22.                     'Nếu thêm các thuộc tính khác thì viết tiếp ở đây.
  23.                     Me.mdtCaptions.Rows.Add(row)
  24.                 End If
  25.                 i += 1
  26.             Loop
  27.             'Sau khi lưu cấu hình thì xóa hết các cột hiện tại
  28.             Me.Columns.Clear()
  29.         Catch exception1 As Exception
  30.             ProjectData.SetProjectError(exception1)
  31.             Dim exceptionCatch As Exception = exception1
  32.             Interaction.MsgBox(("T2Grid21.DefineCaption(): " & "Đã thay đổi phiên bản mới " & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
  33.             ProjectData.ClearProjectError()
  34.  
  35.         End Try
  36.         Return mdtCaptions
  37.     End Function
  38.  

Vậy trước khi gán datasource cho grid hãy gọi hàm này trước.
sau khi gán datasource cho grid hãy goi thủ tục lấy lại các thông tin đã lưu ở hàm DefineCaption. Code như sau :
  1.     Public Sub RestoreCaption(Optional ByVal dtCaption As DataTable = Nothing)
  2.  
  3.         If (Not dtCaption Is Nothing) Then
  4.             Me.mdtCaptions = dtCaption
  5.         End If
  6.         If (((Me.mdtCaptions Is Nothing) OrElse (Me.mdtCaptions Is Nothing)) OrElse (Me.mdtCaptions.Rows.Count <= 0)) Then
  7.             Return
  8.         End If
  9.         Dim num As Integer = 0
  10.         'Ẩn toàn bộ các cột trước
  11.         While num <= Me.Columns.Count - 1
  12.             Me.Columns(num).Visible = False
  13.             num += 1
  14.         End While
  15.         Try
  16.             'Duyệt các dòng trong table đã lưu
  17.             For i As Integer = 0 To Me.mdtCaptions.Rows.Count - 1
  18.                 'duyệt các cột trong grid hiện tại
  19.                 For j As Integer = 0 To Me.Columns.Count - 1
  20.                     If Me.Columns(j).Name = Me.mdtCaptions.Rows(i)("Name") Then
  21.                         Me.Columns(j).HeaderText = Me.mdtCaptions.Rows(i)("HeaderText")
  22.                         Me.Columns(j).Width = Me.mdtCaptions.Rows(i)("Width")
  23.                         Me.Columns(j).Visible = True
  24.                     End If
  25.                 Next
  26.             Next
  27.  
  28.         Catch exception1 As Exception
  29.             ProjectData.SetProjectError(exception1)
  30.             Dim exceptionCatch As Exception = exception1
  31.             Interaction.MsgBox(("RestoreCaption: " & "Đã thay đổi phiên bản mới" & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
  32.             ProjectData.ClearProjectError()
  33.         End Try
  34.     End Sub
  35.  
  36.  

Và đây là code đầy đủ cảu control này :
  1. Imports Microsoft.VisualBasic.CompilerServices
  2.  
  3. Public Class T2Grid21
  4.     Inherits DataGridView
  5.  
  6.     Private mdtCaptions As DataTable
  7.  
  8.     Public Function DefineCaption() As DataTable
  9.         Try
  10.             Me.mdtCaptions = New DataTable
  11.             Me.mdtCaptions.Columns.Add("Index", GetType(Integer))
  12.             Me.mdtCaptions.Columns.Add("Name", GetType(String))
  13.             Me.mdtCaptions.Columns.Add("HeaderText", GetType(String))
  14.             Me.mdtCaptions.Columns.Add("Visible", GetType(Boolean))
  15.             Me.mdtCaptions.Columns.Add("Width", GetType(Integer))
  16.  
  17.             Dim num2 As Integer = (Me.Columns.Count - 1)
  18.             Dim i As Integer = 0
  19.             Do While (i <= num2)
  20.                 If (Me.Columns(i).Name <> "") Then
  21.                     Dim row As DataRow = Me.mdtCaptions.NewRow
  22.                     row.Item("Index") = i
  23.                     row.Item("Name") = Me.Columns(i).Name
  24.                     row.Item("HeaderText") = Me.Columns(i).HeaderText
  25.                     row.Item("Visible") = Me.Columns(i).Visible
  26.                     row.Item("Width") = Me.Columns(i).Width
  27.                     Me.mdtCaptions.Rows.Add(row)
  28.                 End If
  29.                 i += 1
  30.             Loop
  31.             'Sau khi lưu cấu hình thì xóa hết các cột hiện tại
  32.             Me.Columns.Clear()
  33.         Catch exception1 As Exception
  34.             ProjectData.SetProjectError(exception1)
  35.             Dim exceptionCatch As Exception = exception1
  36.             Interaction.MsgBox(("T2Grid21.DefineCaption(): " & "Đã thay đổi phiên bản mới " & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
  37.             ProjectData.ClearProjectError()
  38.  
  39.         End Try
  40.         Return mdtCaptions
  41.     End Function
  42.  
  43.     Public Sub RestoreCaption(Optional ByVal dtCaption As DataTable = Nothing)
  44.  
  45.         If (Not dtCaption Is Nothing) Then
  46.             Me.mdtCaptions = dtCaption
  47.         End If
  48.         If (((Me.mdtCaptions Is Nothing) OrElse (Me.mdtCaptions Is Nothing)) OrElse (Me.mdtCaptions.Rows.Count <= 0)) Then
  49.             Return
  50.         End If
  51.         Dim num As Integer = 0
  52.         'Ẩn toàn bộ các cột trước
  53.         While num <= Me.Columns.Count - 1
  54.             Me.Columns(num).Visible = False
  55.             num += 1
  56.         End While
  57.         Try
  58.             'Duyệt các dòng trong table đã lưu
  59.             For i As Integer = 0 To Me.mdtCaptions.Rows.Count - 1
  60.                 'duyệt các cột trong grid hiện tại
  61.                 For j As Integer = 0 To Me.Columns.Count - 1
  62.                     If Me.Columns(j).Name = Me.mdtCaptions.Rows(i)("Name") Then
  63.                         Me.Columns(j).HeaderText = Me.mdtCaptions.Rows(i)("HeaderText")
  64.                         Me.Columns(j).Width = Me.mdtCaptions.Rows(i)("Width")
  65.                         Me.Columns(j).Visible = True
  66.                     End If
  67.                 Next
  68.             Next
  69.  
  70.         Catch exception1 As Exception
  71.             ProjectData.SetProjectError(exception1)
  72.             Dim exceptionCatch As Exception = exception1
  73.             Interaction.MsgBox(("RestoreCaption: " & "Đã thay đổi phiên bản mới" & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
  74.             ProjectData.ClearProjectError()
  75.         End Try
  76.     End Sub
  77.  
  78. End Class
  79.  
  80.  

Chú ý là sẽ có thể dùng ngay được nhưng có một lỗi nhỏ, các bạn tự tìm và sửa cho hoàn chỉnh nhé :D. Không khó đâu.
Tập tin đính kèm
T2Grid.rar
(32.39 KiB) Đã tải 859 lần



pddung
Bài viết: 7
Ngày tham gia: T.Ba 01/04/2008 7:43 pm

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi pddung » T.Năm 20/05/2010 11:31 pm

sao k dùng " datagridview.AutoGenerateColumns = False "nhỉ

Hình đại diện của người dùng
thuccads
Thành viên tích cực
Thành viên tích cực
Bài viết: 143
Ngày tham gia: T.Hai 01/02/2010 8:35 am
Đến từ: Hà Nội--->Sài Gòn
Been thanked: 1 time
Liên hệ:

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi thuccads » T.Năm 20/05/2010 11:44 pm

pddung đã viết:sao k dùng " datagridview.AutoGenerateColumns = False "nhỉ

Xin được chỉ giáo!

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi tungcan5diop » T.Sáu 21/05/2010 10:43 am

"Nếu ta thiết lập các cột ngay trong giao diện thiết kế thì có vẻ đơn giản hơn, có điều sau khi gán datasource thì grid vẫn giữ các cột ta thêm khi thiết kế cộng với tất cả các trường đã truy vấn"--->gán Name + DataSourceName của các cột = đúng tên các trường mà bạn select trong câu query
"datagridview.AutoGenerateColumns = False "-->cái này để tránh các cột bị mất thứ tự sau khi gán cột
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi Kasper » T.Sáu 21/05/2010 1:45 pm

Tui thiết kế xong rồi gán datasource mà đâu có cần chỉnh lại gì đâu ta :D
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi Kasper » T.Sáu 21/05/2010 2:48 pm

Up một demo không cần tinh chỉnh gì hết sau khi gán datasource mà vẫn bảo đảm các cột như lúc thiết kế.
Tập tin đính kèm
DGV_f.zip
(74.72 KiB) Đã tải 661 lần
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi tungcan5diop » T.Sáu 21/05/2010 6:28 pm

Kasper đã viết:Tui thiết kế xong rồi gán datasource mà đâu có cần chỉnh lại gì đâu ta :D

dùng datasource thì sẽ khó trong việc chỉnh 1 số cái như:chiều rộng,cao,visible,...1 cái lứoi mà chỉ có dùng để View,search thì dùng datasource(ko cần add column thì ok),nhưng nếu dùng lưới để nhập liệu thì add column tiện hơn anh Kasper :D
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Đơn giản hóa định dạng DataGridView

Gửi bàigửi bởi Kasper » T.Hai 24/05/2010 9:47 am

tungcan5diop đã viết:
Kasper đã viết:Tui thiết kế xong rồi gán datasource mà đâu có cần chỉnh lại gì đâu ta :D

dùng datasource thì sẽ khó trong việc chỉnh 1 số cái như:chiều rộng,cao,visible,...1 cái lứoi mà chỉ có dùng để View,search thì dùng datasource(ko cần add column thì ok),nhưng nếu dùng lưới để nhập liệu thì add column tiện hơn anh Kasper :D


Cái demo trên là chỉ minh chứng cho việc: sau khi thực hiện câu lệnh gán datasource cho lưới thì các thiết kế của ta khi design vẫn còn giữ nguyên. Thế thôi.
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.


Quay về “[.NET] Module, Class, UserControl, DLL”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách