Datagridview boksen kolonne - verdi og funksjonalitet

stemmer
16

Jeg har lagt til et avkrysnings kolonne til en Datagridview i min C # form. Funksjonen må være dynamisk - du velger en kunde og som bringer opp alle sine elementer som kan betjenes, og du velger hvilken av dem du ønsker å bli behandlet denne gangen.

Uansett, vil koden nå legge en chckbox til begynnelsen av DGV. Det jeg trenger å vite er følgende:

1) Hvordan gjør jeg det slik at hele kolonnen merket som standard? 2) Hvordan kan jeg sørge for at jeg bare får verdier fra sjekket rader når jeg klikker på en knapp rett under DGV?

Her er koden for å få satt inn kolonne:

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

Så hva blir det neste? Eventuelle hjelpe ville være verdsatt!

Publisert på 06/08/2009 klokken 09:17
kilden bruker
På andre språk...                            


11 svar

stemmer
37

  1. Det er ingen måte å gjøre det direkte. Når du har dine data i nettet, kan du sløyfe gjennom radene og sjekke hver boks som dette:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. Click-hendelsen kan se omtrent slik ut:

    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
    }
    
Svarte 06/08/2009 kl. 12:17
kilden bruker

stemmer
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 løsningen for å finne at boksen i Datagridview er merket eller ikke.

Svarte 29/08/2010 kl. 17:39
kilden bruker

stemmer
3

Det tok meg lang tid å finne ut hvordan du gjør dette uten å sløyfe gjennom alle postene. Jeg har en bundet Datagridview-kilde, og at alle feltene er bundet med unntak av i boksen-kolonnen. Så jeg ikke har / trenger en sløyfe for å legge til hver rad, og jeg ønsket ikke å lage en bare for dette purpuse. Så etter mye prøver jeg endelig fikk den. Og det er faktisk veldig enkelt også:

Først legger du en ny .CS fil til prosjektet med en skredder boksen celle, for eksempel

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

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

Etter dette, på Gridview, der du legger den boksen-kolonnen, gjør du:

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

Og det er det! Hver gang du boksene få lagt inn en ny rad, vil de bli satt til true. Nyt!

Svarte 22/05/2011 kl. 23:35
kilden bruker

stemmer
4

Her er en liner svar på dette spørsmålet

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
Svarte 24/01/2012 kl. 06:37
kilden bruker

stemmer
1

Hvis du har en Gridview som inneholder mer enn én avmerkingsboks .... bør du prøve dette ....

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());
        }
    }
}
Svarte 16/02/2012 kl. 06:29
kilden bruker

stemmer
3

Hvis du prøver det på CellContentClickhendelses

Bruk:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
Svarte 03/10/2012 kl. 14:24
kilden bruker

stemmer
0

For å teste om kolonnen er merket eller ikke:

for (int i = 0; i < dgvName.Rows.Count; i++)
{
    if ((bool)dgvName.Rows[i].Cells[8].Value)
    {
    // Column is checked
    }
}
Svarte 12/01/2013 kl. 06:25
kilden bruker

stemmer
0

1) Hvordan gjør jeg det slik at hele kolonnen "merket" som standard?

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) Hvordan kan jeg sørge for at jeg bare får verdier fra "sjekket" rader?

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
    }
}
Svarte 30/10/2014 kl. 05:31
kilden bruker

stemmer
0

Hvis u gjør denne kolonne i SQL database (bit) i form av en datatype u bør redigere denne koden

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

med dette

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "False";
            doWork.TrueValue = "True";
            dataGridView1.Columns.Insert(0, doWork);
Svarte 01/06/2016 kl. 23:10
kilden bruker

stemmer
0

Det er ganske enkelt

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;
 }
Svarte 30/06/2019 kl. 09:40
kilden bruker

stemmer
0

Hvis kolonnen er allerede opprettet på grunn av binding med et recordset av BIT type, vil den type kolonnen være tekst uansett. Løsningen jeg har funnet er å fjerne denne kolonnen og erstatte den med en "DataGridViewCheckBoxColumn" har de samme bindingsdata.

            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);
Svarte 15/07/2019 kl. 17:25
kilden bruker

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