Đơ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#

Moderators: tungcan5diop, QUANITGROBEST

Forum rules
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]
Post Reply
User avatar
thuccads
Thành viên tích cực
Thành viên tích cực
Posts: 143
Joined: Mon 01/02/2010 8:35 am
Location: Hà Nội--->Sài Gòn
Been thanked: 1 time
Contact:

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

Post by thuccads »

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

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.  

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.  

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.
Attachments
T2Grid.rar
(32.39 KiB) Downloaded 911 times
pddung
Posts: 7
Joined: Tue 01/04/2008 7:43 pm

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

Post by pddung »

sao k dùng " datagridview.AutoGenerateColumns = False "nhỉ
User avatar
thuccads
Thành viên tích cực
Thành viên tích cực
Posts: 143
Joined: Mon 01/02/2010 8:35 am
Location: Hà Nội--->Sài Gòn
Been thanked: 1 time
Contact:

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

Post by thuccads »

pddung wrote:sao k dùng " datagridview.AutoGenerateColumns = False "nhỉ
Xin được chỉ giáo!
User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 27 times

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

Post by tungcan5diop »

"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!
User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

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

Post by Kasper »

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.
User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

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

Post by Kasper »

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ế.
Attachments
DGV_f.zip
(74.72 KiB) Downloaded 709 times
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.
User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 27 times

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

Post by tungcan5diop »

Kasper wrote: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!
User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

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

Post by Kasper »

tungcan5diop wrote:
Kasper wrote: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.
Post Reply

Return to “[.NET] Module, Class, UserControl, DLL”