DataGridView checkbox kolom - waarde en functionaliteit

stemmen
17

Ik heb een checkbox kolom om een ​​DataGridView in mijn C # vorm toegevoegd. De functie moet dynamisch zijn - u een klant kiezen en dat brengt al hun items die kunnen worden onderhouden, en kiest u welke van hen u rond worden onderhouden deze tijd.

Hoe dan ook, de code zal nu een chckbox toe te voegen aan het begin van de DGV. Wat ik moet weten is het volgende:

1) Hoe maak ik het zo dat de hele kolom wordt gecontroleerd standaard? 2) Hoe kan ik ervoor zorgen dat ik ben alleen het verkrijgen van de waarden van de gecontroleerde rijen wanneer ik op een knop net onder de DGV?

Hier is de code aan de kolom geplaatst te krijgen:

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

Dus wat is het volgende? Alle hulp zou zeer gewaardeerd worden!

De vraag is gesteld op 06/08/2009 om 10:17
bron van user
In andere talen...                            


11 antwoorden

stemmen
37

  1. Er is geen manier om dat direct te doen. Zodra u uw gegevens in het raster, kun je lus door de rijen en controleren elk vak als volgt uit:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. De gebeurtenis Click zou er ongeveer zo uitzien:

    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
    }
    
antwoordde op 06/08/2009 om 13:17
bron van user

stemmen
14
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());
}

beste oplossing te vinden als het selectievakje in de datagridview niet wordt gecontroleerd of niet.

antwoordde op 29/08/2010 om 18:39
bron van user

stemmen
3

het kostte me een lange tijd om erachter te komen hoe dit te doen zonder lus door alle records. Ik heb een gebonden datagridview-source, en alle velden zijn verplicht, behalve voor de checkbox-kolom. Dus ik heb geen / behoefte aan een lus aan elke rij toe te voegen en ik wilde niet dat er een te maken alleen voor deze purpuse. Dus na een heleboel proberen heb ik het eindelijk. En het is eigenlijk heel simpel ook:

Eerst moet je een nieuwe .cs bestand toe te voegen aan uw project met een op maat checkbox cel, bv

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

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

Na deze, op uw GridView, waar u het selectievakje-kolom toe te voegen, doet u:

// 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);

En dat is het! Elke keer dat je vakjes krijgen toegevoegd in een nieuwe rij, zullen ze worden ingesteld op true. Genieten!

antwoordde op 23/05/2011 om 00:35
bron van user

stemmen
4

Hier is een one-liner antwoord op deze vraag

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
antwoordde op 24/01/2012 om 07:37
bron van user

stemmen
1

Als u een gridview die meer dan één vakje .... je moet proberen dit ....

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());
        }
    }
}
antwoordde op 16/02/2012 om 07:29
bron van user

stemmen
3

Als je het proberen op CellContentClickEvent

Gebruik:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
antwoordde op 03/10/2012 om 15:24
bron van user

stemmen
0

Om te testen of de kolom niet wordt gecontroleerd of:

for (int i = 0; i < dgvName.Rows.Count; i++)
{
    if ((bool)dgvName.Rows[i].Cells[8].Value)
    {
    // Column is checked
    }
}
antwoordde op 12/01/2013 om 07:25
bron van user

stemmen
1

1) Hoe maak ik het zo dat de hele kolom wordt "gecontroleerd" standaard?

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) Hoe kan ik ervoor zorgen dat ik ben alleen het verkrijgen van de waarden van de "gecontroleerde" rijen?

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
    }
}
antwoordde op 30/10/2014 om 05:31
bron van user

stemmen
0

Als u maken deze kolom in SQL-database (bit) als gegevenstype dient u de code te bewerken

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

hiermee

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "False";
            doWork.TrueValue = "True";
            dataGridView1.Columns.Insert(0, doWork);
antwoordde op 01/06/2016 om 23:10
bron van user

stemmen
0

Het is heel simpel

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;
 }
antwoordde op 30/06/2019 om 09:40
bron van user

stemmen
0

Als uw column al te wijten aan binding met een record van BIT-type is gemaakt, wordt het type van de kolom tekst toch. De oplossing ik heb gevonden is die kolom te verwijderen en te vervangen door een "DataGridViewCheckBoxColumn" die dezelfde bindingsgegevens.

            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);
antwoordde op 15/07/2019 om 17:25
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more