[VB.NET] Tạo hộp CheckBox trên tiêu đề để chọn hết trong DataGridView

Liên hệ QC

Thanh Bình PV

Thành viên hoạt động
Tham gia
30/10/19
Bài viết
151
Được thích
19
Em có tạo 1 Form trong VB.NET bao gồm DataGridView và các Button. Về dữ liệu em sẽ thêm vào DataGridView khi mở Form lên.
Trong DataGridView em có tạo 1 cột CheckBox.
Em muốn thêm 1 CheckBox nhỏ trên tiêu đề của DataGridView để có thể chọn toàn bộ dữ liệu. (dữ liệu tầm 50 dòng)
Em có thử tìm trên mạng nhưng mà vẫn chưa làm được ạ. Và đa số được viết bằng C# nên khi chuyển sang VB.NET thì không đầy đủ cũng như không thực hiện được.
e227bb633175cb2b9264.jpg
Em cảm ơn.
 
mình không biết về vb.net nhưng theo mình nghĩ là bạn duyệt từng dòng và checked cho từng cái 1 thôi.
Dạng for (int i = 0; i <grid.rows.count;i++)
{
grid.rows[0].checked = true
}
 
mình không biết về vb.net nhưng theo mình nghĩ là bạn duyệt từng dòng và checked cho từng cái 1 thôi.
Dạng for (int i = 0; i <grid.rows.count;i++)
{
grid.rows[0].checked = true
}
Nếu vậy thì em phải thêm 1 Button nữa để có thể chọn toàn bộ. Em vẫn muốn có nút đó để có thể linh hoạt hơn và nhìn Form cũng đẹp hơn nữa. :D
 
Em cũng đã thử rồi nhưng vẫn không hiểu tại sao bị lỗi.
1588140721141.png
Bài đã được tự động gộp:

cần gì thêm button nhỉ? đưa code vào sự kiện của checkbox là đc
Sự kiện nào anh.
Em muốn checked cho toàn bộ bằng 1 lần nhấn.
 
Đây là kiểu mình ăn liền:

Khi start form, gọi
ASP.net:
ColumnCheckbox(NameOfGridview)

ASP.net:
private CheckBox ColumnCheckbox(DataGridView dataGridView)
    {
        CheckBox checkBox = new CheckBox();
        checkBox.Size = new Size(15, 15);
        checkBox.BackColor = Color.Transparent;

        // Reset properties
        checkBox.Padding = new Padding(0);
        checkBox.Margin = new Padding(0);
        checkBox.Text = "";

        // Add checkbox to datagrid cell
        dataGridView.Controls.Add(checkBox);
        DataGridViewHeaderCell header = dataGridView.Columns[0].HeaderCell;
        checkBox.Location = new Point(
            (header.ContentBounds.Left +
             (header.ContentBounds.Right - header.ContentBounds.Left + checkBox.Size.Width)
             /2) - 2,
            (header.ContentBounds.Top +
             (header.ContentBounds.Bottom - header.ContentBounds.Top + checkBox.Size.Height)
             /2) - 2);
        return checkBox;
    }
Còn muốn ngon lành thì viết cho nó cái plugin với đầy đủ các event
 
Đây là kiểu mình ăn liền:

Khi start form, gọi
ASP.net:
ColumnCheckbox(NameOfGridview)

ASP.net:
private CheckBox ColumnCheckbox(DataGridView dataGridView)
    {
        CheckBox checkBox = new CheckBox();
        checkBox.Size = new Size(15, 15);
        checkBox.BackColor = Color.Transparent;

        // Reset properties
        checkBox.Padding = new Padding(0);
        checkBox.Margin = new Padding(0);
        checkBox.Text = "";

        // Add checkbox to datagrid cell
        dataGridView.Controls.Add(checkBox);
        DataGridViewHeaderCell header = dataGridView.Columns[0].HeaderCell;
        checkBox.Location = new Point(
            (header.ContentBounds.Left +
             (header.ContentBounds.Right - header.ContentBounds.Left + checkBox.Size.Width)
             /2) - 2,
            (header.ContentBounds.Top +
             (header.ContentBounds.Bottom - header.ContentBounds.Top + checkBox.Size.Height)
             /2) - 2);
        return checkBox;
    }
Em cảm ơn.
Khổ nỗi em viết bằng VB.NET nên không sài được code của bác ạ.

Còn muốn ngon lành thì viết cho nó cái plugin với đầy đủ các event
Này thì em bó tay rồi. :)))
 
Em cảm ơn.
Khổ nỗi em viết bằng VB.NET nên không sài được code của bác ạ.
...
C# cũng gần như có thể dịch ra VB.Net từng dòng. Trừ phần lambda thì hơi rắc rối, nhưng code trên đâu có lambda.
Trên mạng cũng có một số phần mềm chùa để dịch mà.
 
C# cũng gần như có thể dịch ra VB.Net từng dòng. Trừ phần lambda thì hơi rắc rối, nhưng code trên đâu có lambda.
Trên mạng cũng có một số phần mềm chùa để dịch mà.
Em cũng có dịch từ C# sang VB.NET và tùy biến cho phù hợp nhưng chưa thành công.

Em đã thử lại và thành công với code này. Mặc dù phải chỉnh sửa 1 vài chỗ.
Nhưng em lại không hoàn thiện được ở sự kiện cellclick . Khi em chọn hết tất cả checkbox nhưng ở checkbox trên tiêu đề không tự chọn. Mọi người giúp em đoạn này với ạ.
Mã:
Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
    'Check to ensure that the row CheckBox is clicked.
    If e.RowIndex >= 0 AndAlso e.ColumnIndex = 0 Then
 
        'Loop to verify whether all row CheckBoxes are checked or not.
        Dim isChecked As Boolean = True
        For Each row As DataGridViewRow In dataGridView1.Rows
            If Convert.ToBoolean(row.Cells("checkBoxColumn").EditedFormattedValue) = False Then
                isChecked = False
                Exit For
            End If
        Next
 
        headerCheckBox.Checked = isChecked
    End If
End Sub
 
Bạn tạo 1 biến toàn cục để đếm số checkbox được chọn, trong thủ tục sự kiện của check box sẽ tăng giảm biến đếm này rồi kiểm tra xem biến đếm có bằng tổng số check box không.
 
Mã:
Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
    'Check to ensure that the row CheckBox is clicked.
    If e.RowIndex >= 0 AndAlso e.ColumnIndex = 0 Then

        'Loop to verify whether all row CheckBoxes are checked or not.
        Dim isChecked As Boolean = True
        For Each row As DataGridViewRow In dataGridView1.Rows
            If Convert.ToBoolean(row.Cells("checkBoxColumn").EditedFormattedValue) = False Then
                isChecked = False
                Exit For
            End If
        Next

        headerCheckBox.Checked = isChecked
    End If
End Sub
Theo mình hiểu thì code trên link tham khảo e.ColumnIndex = 0 còn của ví dụ của bạn có thêm cột STT nữa thì mình nghĩ là e.ColumnIndex = 1 mới đúng, nếu không phải thì bạn thử debug từng dòng và xem giá trị biến coi nó có đúng không, hoặc gửi file lên mọi người xem mới hỗ trợ bạn được.
 
Bạn tạo 1 biến toàn cục để đếm số checkbox được chọn, trong thủ tục sự kiện của check box sẽ tăng giảm biến đếm này rồi kiểm tra xem biến đếm có bằng tổng số check box không.
Em sẽ thử ạ. Em cảm ơn.
Theo mình hiểu thì code trên link tham khảo e.ColumnIndex = 0 còn của ví dụ của bạn có thêm cột STT nữa thì mình nghĩ là e.ColumnIndex = 1 mới đúng, nếu không phải thì bạn thử debug từng dòng và xem giá trị biến coi nó có đúng không, hoặc gửi file lên mọi người xem mới hỗ trợ bạn được.
Không được rồi anh. Em cũng muốn debug từng dòng lắm. Nhưng em lập trình cho phần mềm . Khi debug là nó mở phần mềm lên luôn không xem từng dòng được ạ.
 
Sau 1 hồi lần mò, kết quả là chỉ cần thêm 1 dấu ">" vào trong code là chạy tốt ạ. o_O o_O
"Có những điều tưởng chừng như đơn giản nhưng chính nó lại làm cho mọi chuyện trở nên phức tạp."
Mã:
Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
    'Check to ensure that the row CheckBox is clicked.
    If e.RowIndex >= 0 AndAlso e.ColumnIndex >= 0 Then
 
        'Loop to verify whether all row CheckBoxes are checked or not.
        Dim isChecked As Boolean = True
        For Each row As DataGridViewRow In dataGridView1.Rows
            If Convert.ToBoolean(row.Cells("checkBoxColumn").EditedFormattedValue) = False Then
                isChecked = False
                Exit For
            End If
        Next
 
        headerCheckBox.Checked = isChecked
    End If
End Sub
 
Không được rồi anh. Em cũng muốn debug từng dòng lắm. Nhưng em lập trình cho phần mềm . Khi debug là nó mở phần mềm lên luôn không xem từng dòng được ạ.
Sau 1 hồi lần mò, kết quả là chỉ cần thêm 1 dấu ">" vào trong code là chạy tốt ạ. o_O o_O
"Có những điều tưởng chừng như đơn giản nhưng chính nó lại làm cho mọi chuyện trở nên phức tạp."
Không biết bạn dùng IDE nào để lập trình phần mềm mà debug không được nhỉ? Mình nghĩ là bạn nên dùng IDE khác, chứ code mà không debug được thì lỗi biết đâu mà sửa.
 
Không biết bạn dùng IDE nào để lập trình phần mềm mà debug không được nhỉ? Mình nghĩ là bạn nên dùng IDE khác, chứ code mà không debug được thì lỗi biết đâu mà sửa.
Em sử dụng Visual Studio 2019 ạ. Mà em muốn debug thì phải mở phần mềm lên. Mà mở lên thì không debug được. (Em lập trình cho phần mềm Inventor).
 
Web KT
Back
Top Bottom