colonna casella di controllo DataGridView - il valore e la funzionalità

voti
17

Ho aggiunto una colonna casella di controllo per un DataGridView nel mio modulo C #. La funzione deve essere dinamica - si seleziona un cliente, porta in primo piano tutti i loro elementi che potrebbero essere fornite, e si seleziona quale di essi si desidera essere servito questa volta.

In ogni caso, il codice sarà ora aggiungere un chckbox per l'inizio del DGV. Che cosa ho bisogno di sapere è la seguente:

1) Come faccio a fare in modo che l'intera colonna è controllata di default? 2) Come posso fare in modo che sto ottenendo soltanto valori dalle righe controllato quando si fa clic su un pulsante appena sotto la DGV?

Ecco il codice per ottenere la colonna inserita:

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

Quindi che succede adesso? Qualsiasi aiuto sarebbe molto apprezzato!

È pubblicato 06/08/2009 alle 10:17
fonte dall'utente
In altre lingue...                            


11 risposte

voti
37

  1. Non c'è modo di farlo direttamente. Una volta che avete i vostri dati nella griglia, è possibile scorrere le righe e controllare ogni scatola come questa:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. L'evento Click potrebbe essere simile a questo:

    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
    }
    
Risposto il 06/08/2009 a 13:17
fonte dall'utente

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

migliore soluzione per trovare se la casella di controllo nella datagridview è selezionata o meno.

Risposto il 29/08/2010 a 18:39
fonte dall'utente

voti
3

mi c'è voluto molto tempo per capire come fare questo senza dover scorrere tutti i record. Ho un datagridview-source legato, e tutti i campi sono vincolati ad eccezione della casella di controllo-colonna. Quindi non ho / bisogno di un ciclo per aggiungere ogni riga e non volevo creare uno solo per questo purpuse. Così, dopo un sacco di cercare ho finalmente capito. Ed è in realtà molto semplice anche:

In primo luogo si aggiunge un nuovo cs file al progetto con una cellula-casella di controllo personalizzato, ad esempio,

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

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

Dopo questo, sul tuo GridView, in cui si aggiunge la casella colonne, si fa:

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

E questo è tutto! Ogni volta che le vostre caselle di controllo vengono aggiunti in una nuova riga, saranno impostate su true. Godere!

Risposto il 23/05/2011 a 00:35
fonte dall'utente

voti
4

Ecco una risposta uno di linea per questa domanda

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
Risposto il 24/01/2012 a 07:37
fonte dall'utente

voti
1

Se si dispone di una GridView che contiene più di una casella di controllo .... si dovrebbe provare questo ....

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());
        }
    }
}
Risposto il 16/02/2012 a 07:29
fonte dall'utente

voti
3

Se lo provate su CellContentClickeventi

Uso:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
Risposto il 03/10/2012 a 15:24
fonte dall'utente

voti
0

Per verificare se la colonna è selezionata o meno:

for (int i = 0; i < dgvName.Rows.Count; i++)
{
    if ((bool)dgvName.Rows[i].Cells[8].Value)
    {
    // Column is checked
    }
}
Risposto il 12/01/2013 a 07:25
fonte dall'utente

voti
1

1) Come faccio a fare in modo che l'intera colonna è "controllata" di default?

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) Come posso fare in modo che sto ottenendo soltanto valori dalle righe "controllato"?

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
    }
}
Risposto il 30/10/2014 a 05:31
fonte dall'utente

voti
0

se u fare questa colonna nel database SQL (bit) come tipo di dati u dovrebbe modificare questo codice

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

con questo

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "False";
            doWork.TrueValue = "True";
            dataGridView1.Columns.Insert(0, doWork);
Risposto il 01/06/2016 a 23:10
fonte dall'utente

voti
0

E 'abbastanza semplice

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;
 }
Risposto il 30/06/2019 a 09:40
fonte dall'utente

voti
0

Se la colonna è stato già creato dovuta al legame con un recordset di tipo BIT, il tipo della colonna di testo sarà in ogni caso. La soluzione che ho trovato è quello di rimuovere quella colonna e sostituirla con una "DataGridViewCheckBoxColumn" aventi gli stessi dati di legame.

            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);
Risposto il 15/07/2019 a 17:25
fonte dall'utente

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