Thông tin

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

Bộ sưu tập các thư viện hỗ trợ sẳn cho .Net

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

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]

Đơ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 :
Syntax: [ Download ] [ Hide ]
Using vbnet Syntax Highlighting
    Private mdtCaptions As DataTable

    Public Function DefineCaption() As DataTable
        Try
            Me.mdtCaptions = New DataTable
            Me.mdtCaptions.Columns.Add("Index", GetType(Integer))
            Me.mdtCaptions.Columns.Add("Name", GetType(String))
            Me.mdtCaptions.Columns.Add("HeaderText", GetType(String))
            Me.mdtCaptions.Columns.Add("Visible", GetType(Boolean))
            Me.mdtCaptions.Columns.Add("Width", GetType(Integer))
            'Nếu thêm các thuộc tính khác thì viết tiếp ở đây.
            Dim num2 As Integer = (Me.Columns.Count - 1)
            Dim i As Integer = 0
            Do While (i <= num2)
                If (Me.Columns(i).Name <> "") Then
                    Dim row As DataRow = Me.mdtCaptions.NewRow
                    row.Item("Index") = i
                    row.Item("Name") = Me.Columns(i).Name
                    row.Item("HeaderText") = Me.Columns(i).HeaderText
                    row.Item("Visible") = Me.Columns(i).Visible
                    row.Item("Width") = Me.Columns(i).Width
                    'Nếu thêm các thuộc tính khác thì viết tiếp ở đây.
                    Me.mdtCaptions.Rows.Add(row)
                End If
                i += 1
            Loop
            'Sau khi lưu cấu hình thì xóa hết các cột hiện tại
            Me.Columns.Clear()
        Catch exception1 As Exception
            ProjectData.SetProjectError(exception1)
            Dim exceptionCatch As Exception = exception1
            Interaction.MsgBox(("T2Grid21.DefineCaption(): " & "Đã thay đổi phiên bản mới " & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
            ProjectData.ClearProjectError()

        End Try
        Return mdtCaptions
    End Function
 
Parsed in 0.026 seconds, using GeSHi 1.0.8.4

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 :
Syntax: [ Download ] [ Hide ]
Using vbnet Syntax Highlighting
    Public Sub RestoreCaption(Optional ByVal dtCaption As DataTable = Nothing)

        If (Not dtCaption Is Nothing) Then
            Me.mdtCaptions = dtCaption
        End If
        If (((Me.mdtCaptions Is Nothing) OrElse (Me.mdtCaptions Is Nothing)) OrElse (Me.mdtCaptions.Rows.Count <= 0)) Then
            Return
        End If
        Dim num As Integer = 0
        'Ẩn toàn bộ các cột trước
        While num <= Me.Columns.Count - 1
            Me.Columns(num).Visible = False
            num += 1
        End While
        Try
            'Duyệt các dòng trong table đã lưu
            For i As Integer = 0 To Me.mdtCaptions.Rows.Count - 1
                'duyệt các cột trong grid hiện tại
                For j As Integer = 0 To Me.Columns.Count - 1
                    If Me.Columns(j).Name = Me.mdtCaptions.Rows(i)("Name") Then
                        Me.Columns(j).HeaderText = Me.mdtCaptions.Rows(i)("HeaderText")
                        Me.Columns(j).Width = Me.mdtCaptions.Rows(i)("Width")
                        Me.Columns(j).Visible = True
                    End If
                Next
            Next

        Catch exception1 As Exception
            ProjectData.SetProjectError(exception1)
            Dim exceptionCatch As Exception = exception1
            Interaction.MsgBox(("RestoreCaption: " & "Đã thay đổi phiên bản mới" & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
            ProjectData.ClearProjectError()
        End Try
    End Sub

 
Parsed in 0.022 seconds, using GeSHi 1.0.8.4

Và đây là code đầy đủ cảu control này :
Syntax: [ Download ] [ Hide ]
Using vbnet Syntax Highlighting
Imports Microsoft.VisualBasic.CompilerServices

Public Class T2Grid21
    Inherits DataGridView

    Private mdtCaptions As DataTable

    Public Function DefineCaption() As DataTable
        Try
            Me.mdtCaptions = New DataTable
            Me.mdtCaptions.Columns.Add("Index", GetType(Integer))
            Me.mdtCaptions.Columns.Add("Name", GetType(String))
            Me.mdtCaptions.Columns.Add("HeaderText", GetType(String))
            Me.mdtCaptions.Columns.Add("Visible", GetType(Boolean))
            Me.mdtCaptions.Columns.Add("Width", GetType(Integer))

            Dim num2 As Integer = (Me.Columns.Count - 1)
            Dim i As Integer = 0
            Do While (i <= num2)
                If (Me.Columns(i).Name <> "") Then
                    Dim row As DataRow = Me.mdtCaptions.NewRow
                    row.Item("Index") = i
                    row.Item("Name") = Me.Columns(i).Name
                    row.Item("HeaderText") = Me.Columns(i).HeaderText
                    row.Item("Visible") = Me.Columns(i).Visible
                    row.Item("Width") = Me.Columns(i).Width
                    Me.mdtCaptions.Rows.Add(row)
                End If
                i += 1
            Loop
            'Sau khi lưu cấu hình thì xóa hết các cột hiện tại
            Me.Columns.Clear()
        Catch exception1 As Exception
            ProjectData.SetProjectError(exception1)
            Dim exceptionCatch As Exception = exception1
            Interaction.MsgBox(("T2Grid21.DefineCaption(): " & "Đã thay đổi phiên bản mới " & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
            ProjectData.ClearProjectError()

        End Try
        Return mdtCaptions
    End Function

    Public Sub RestoreCaption(Optional ByVal dtCaption As DataTable = Nothing)

        If (Not dtCaption Is Nothing) Then
            Me.mdtCaptions = dtCaption
        End If
        If (((Me.mdtCaptions Is Nothing) OrElse (Me.mdtCaptions Is Nothing)) OrElse (Me.mdtCaptions.Rows.Count <= 0)) Then
            Return
        End If
        Dim num As Integer = 0
        'Ẩn toàn bộ các cột trước
        While num <= Me.Columns.Count - 1
            Me.Columns(num).Visible = False
            num += 1
        End While
        Try
            'Duyệt các dòng trong table đã lưu
            For i As Integer = 0 To Me.mdtCaptions.Rows.Count - 1
                'duyệt các cột trong grid hiện tại
                For j As Integer = 0 To Me.Columns.Count - 1
                    If Me.Columns(j).Name = Me.mdtCaptions.Rows(i)("Name") Then
                        Me.Columns(j).HeaderText = Me.mdtCaptions.Rows(i)("HeaderText")
                        Me.Columns(j).Width = Me.mdtCaptions.Rows(i)("Width")
                        Me.Columns(j).Visible = True
                    End If
                Next
            Next

        Catch exception1 As Exception
            ProjectData.SetProjectError(exception1)
            Dim exceptionCatch As Exception = exception1
            Interaction.MsgBox(("RestoreCaption: " & "Đã thay đổi phiên bản mới" & vbCrLf & exceptionCatch.Message), MsgBoxStyle.OkOnly, Nothing)
            ProjectData.ClearProjectError()
        End Try
    End Sub

End Class

 
Parsed in 0.037 seconds, using GeSHi 1.0.8.4

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 về 198 lần.
Hình đại diện của thành viên
thuccads
Thành viên tích cực
Thành viên tích cực
 
Bài viết: 138
Ngày tham gia: T.Hai 01/02/2010 8:35 am
Đến từ: Hà Nội--->Sài Gòn

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ỉ
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 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 thành viên
thuccads
Thành viên tích cực
Thành viên tích cực
 
Bài viết: 138
Ngày tham gia: T.Hai 01/02/2010 8:35 am
Đến từ: Hà Nội--->Sài Gòn

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 thành viên
tungcan5diop
Support Staff
Support Staff
 
Bài viết: 1013
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM

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
Time never waits. But for love, it may.
Thời gian như nước cuốn trôi.
Tình yêu vẫn đợi người nơi chân cầu.
Hình đại diện của thành viên
Kasper
Advance Member
Advance Member
 
Bài viết: 723
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Đến từ: http://www.sivc.com.vn - SIVC - Tôn vinh giá trị đích thực

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 về 173 lần.
Time never waits. But for love, it may.
Thời gian như nước cuốn trôi.
Tình yêu vẫn đợi người nơi chân cầu.
Hình đại diện của thành viên
Kasper
Advance Member
Advance Member
 
Bài viết: 723
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Đến từ: http://www.sivc.com.vn - SIVC - Tôn vinh giá trị đích thực

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 thành viên
tungcan5diop
Support Staff
Support Staff
 
Bài viết: 1013
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM

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.
Time never waits. But for love, it may.
Thời gian như nước cuốn trôi.
Tình yêu vẫn đợi người nơi chân cầu.
Hình đại diện của thành viên
Kasper
Advance Member
Advance Member
 
Bài viết: 723
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Đến từ: http://www.sivc.com.vn - SIVC - Tôn vinh giá trị đích thực


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.0 khách.