it-swarm-vi.tech

Cột hộp kiểm DataGridView - giá trị và chức năng

Tôi đã thêm một cột hộp kiểm vào DataGridView ở dạng C # của mình. Chức năng cần phải năng động - bạn chọn một khách hàng và sẽ đưa ra tất cả các mặt hàng của họ có thể được phục vụ và bạn chọn những mặt hàng nào bạn muốn được phục vụ trong khoảng thời gian này.

Dù sao, mã bây giờ sẽ thêm một chckbox vào đầu DGV. Những gì tôi cần biết là như sau:

1) Làm cách nào để tôi làm cho nó sao cho toàn bộ cột được "kiểm tra" theo mặc định? 2) Làm cách nào để đảm bảo tôi chỉ nhận được giá trị từ các hàng "đã kiểm tra" khi tôi nhấp vào nút ngay bên dưới DGV?

Đây là mã để đưa cột vào:

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "0";
            doWork.TrueValue = "1";
            dataGridView1.Columns.Insert(0, doWork);

Vì vậy, điều gì tiếp theo? Bất kỳ trợ giúp sẽ được đánh giá rất cao!

16
David Archer
  1. Không có cách nào để làm điều đó trực tiếp. Khi bạn có dữ liệu của mình trong lưới, bạn có thể lặp qua các hàng và kiểm tra từng hộp như thế này:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. Sự kiện Click có thể trông giống như thế này:

    private void button1_Click(object sender, EventArgs e)
    {
        List<DataGridViewRow> rows_with_checked_column = new List<DataGridViewRow>();
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (Convert.ToBoolean(row.Cells[CheckBoxColumn1.Name].Value) == true)
            {
                rows_with_checked_column.Add(row);
            }
        }
        // Do what you want with the check rows
    }
    
37
SwDevMan81
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell();
    ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0];

    if (ch1.Value == null)
        ch1.Value=false;
    switch (ch1.Value.ToString())
    {
        case "True":
            ch1.Value = false;
            break;
        case "False":
            ch1.Value = true;
            break;
    }
    MessageBox.Show(ch1.Value.ToString());
}

giải pháp tốt nhất để tìm xem hộp kiểm trong datagridview có được kiểm tra hay không.

14
Nazeer

Đây là một câu trả lời lót cho câu hỏi này

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
4
Rob

tôi đã mất một thời gian dài để tìm ra cách để làm điều này mà không phải lặp qua tất cả các hồ sơ. Tôi có một nguồn dữ liệu bị ràng buộc và tất cả các trường bị ràng buộc ngoại trừ cột hộp kiểm. Vì vậy, tôi không có/cần một vòng lặp để thêm từng hàng và tôi không muốn tạo một vòng chỉ cho mục đích này. Vì vậy, sau rất nhiều cố gắng cuối cùng tôi đã có được nó. Và nó thực sự cũng rất đơn giản:

Trước tiên, bạn thêm Tệp .cs mới vào dự án của mình bằng ô hộp kiểm tùy chỉnh, ví dụ: 

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

namespace MyNamespace {
    public class DataGridViewCheckboxCellFilter : DataGridViewCheckBoxCell {
        public DataGridViewCheckboxCellFilter() : base() {
            this.FalseValue = 0;
            this.TrueValue = 1;
            this.Value = TrueValue;
        }
    }
}

Sau này, trên GridView của bạn, nơi bạn thêm cột hộp kiểm, bạn làm:

// add checkboxes
DataGridViewCheckBoxColumn col_chkbox = new DataGridViewCheckBoxColumn();
{
    col_chkbox.HeaderText = "X";
    col_chkbox.Name = "checked";
    col_chkbox.CellTemplate = new DataGridViewCheckboxCellFilter();                
}
this.Columns.Add(col_chkbox);

Và đó là nó! Mỗi khi hộp kiểm của bạn được thêm vào một hàng mới, chúng sẽ được đặt thành đúng . Tận hưởng!

3
andzep

Nếu bạn thử nó trên CellContentClick Sự kiện

Sử dụng:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
3
Atul Jain

Nếu bạn có một Gridview chứa nhiều hơn một hộp kiểm .... Bạn nên thử cái này ....

Object[] o=new Object[6];

for (int i = 0; i < dgverlist.RowCount; i++)
{
    for (int j = 2; j < dgverlist.ColumnCount; j++)
    {
        DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell();
        ch1 = (DataGridViewCheckBoxCell)dgverlist.Rows[i].Cells[j];

        if (ch1.Value != null)
        {
           o[i] = ch1.OwningColumn.HeaderText.ToString();

            MessageBox.Show(o[i].ToString());
        }
    }
}
1
Amin Mansuri

Nó khá đơn giản

DataGridViewCheckBoxCell checkedCell = (DataGridViewCheckBoxCell) grdData.Rows[e.RowIndex].Cells["grdChkEnable"];

                bool isEnabled = false;
                if (checkedCell.AccessibilityObject.State.HasFlag(AccessibleStates.Checked))
                {
                    isEnabled = true;
                }
if(isEnabled)
 {
   // do your business process;
 }
0
Nasrudeen

Nếu cột của bạn đã được tạo do liên kết với tập bản ghi loại BIT, loại cột sẽ vẫn là văn bản. Giải pháp tôi đã tìm thấy là xóa cột đó và thay thế nó bằng "DataGridViewCheckBoxColumn" có cùng dữ liệu ràng buộc.

            DataGridViewColumn oldCol = dgViewCategory.Columns["mycolumn"];
            int chkIdx = oldCol.Index;
            DataGridViewCheckBoxColumn chkCol = new DataGridViewCheckBoxColumn();
            chkCol.HeaderText = oldCol.HeaderText;
            chkCol.FalseValue = "False";
            chkCol.TrueValue = "True";
            chkCol.DataPropertyName = oldCol.DataPropertyName;
            chkCol.Name = oldCol.Name;
            dgViewCategory.Columns.RemoveAt(chkIdx);
            dgViewCategory.Columns.Insert(chkIdx, chkCol);
0
user2991288

nếu bạn tạo cột này trong cơ sở dữ liệu sql (bit) làm kiểu dữ liệu, bạn nên chỉnh sửa mã này

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "0";
            doWork.TrueValue = "1";
            dataGridView1.Columns.Insert(0, doWork);

với cái này

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "False";
            doWork.TrueValue = "True";
            dataGridView1.Columns.Insert(0, doWork);
0

Để kiểm tra xem cột có được kiểm tra hay không:

for (int i = 0; i < dgvName.Rows.Count; i++)
{
    if ((bool)dgvName.Rows[i].Cells[8].Value)
    {
    // Column is checked
    }
}
0
Roozi

1) Làm thế nào để tôi làm cho nó để toàn bộ cột được "kiểm tra" theo mặc định?

var doWork = new DataGridViewCheckBoxColumn();
doWork.Name = "IncludeDog" //Added so you can find the column in a row
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "0";
doWork.TrueValue = "1";

//Make the default checked
doWork.CellTemplate.Value = true;
doWork.CellTemplate.Style.NullValue = true;

dataGridView1.Columns.Insert(0, doWork);

2) Làm cách nào tôi có thể chắc chắn rằng mình chỉ nhận được các giá trị từ các hàng "đã kiểm tra"?

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (row.IsNewRow) continue;//If editing is enabled, skip the new row

    //The Cell's Value gets it wrong with the true default, it will return         
    //false until the cell changes so use FormattedValue instead.
    if (Convert.ToBoolean(row.Cells["IncludeDog"].FormattedValue))
    {
        //Do stuff with row
    }
}
0
DarkChowder