it-swarm.com.de

Aktivieren/Deaktivieren Sie ein Kontrollkästchen in Datagridview

Kann mir jemand helfen, warum es nicht funktioniert? Ich habe eine checkbox. Wenn ich darauf klicke, Sollte dies alle Kontrollkästchen im Datagridview deaktivieren, die aktiviert wurden, bevor das vom Benutzer ausgewählte Kontrollkästchen hinzugefügt wurde.

Hier ist der Code:

        private void chkItems_CheckedChanged(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in datagridview1.Rows)
            {
                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1];
                if (chk.Selected == true)
                {
                    chk.Selected = false;
                }
                else
                {
                    chk.Selected = true;
                }
            }
        }

das Kontrollkästchen sollte nicht ausgewählt werden. es sollte geprüft werden.

hier ist die hinzugefügte Spalte

            DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn();
            CheckBox chk = new CheckBox();
            CheckboxColumn.Width = 20;
            datagridview1.Columns.Add(CheckboxColumn);
22
user1647667

Beim Betrachten dieses MSDN Forum Posting wird vorgeschlagen, den Wert der Zelle mit Cell.TrueValue zu vergleichen.

Nach seinem Beispiel sollte Ihr Code ungefähr so ​​aussehen: (das ist völlig ungetestet)

Bearbeiten: Es scheint, dass der Standardwert für Cell.TrueValue für eine nicht gebundene DataGridViewCheckBox null ist. Sie müssen ihn in der Spaltendefinition festlegen.

private void chkItems_CheckedChanged(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1];
        if (chk.Value  == chk.TrueValue)
        {
            chk.Value = chk.FalseValue;
        }
        else
        {
            chk.Value = chk.TrueValue;
        }
    }
}

Dieser Code ist ein Hinweis zur Einstellung von TrueValue und FalseValue im Konstruktor. Außerdem wird der Wert auf null überprüft:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn();
        CheckboxColumn.TrueValue = true;
        CheckboxColumn.FalseValue = false;
        CheckboxColumn.Width = 100;
        dataGridView1.Columns.Add(CheckboxColumn);
        dataGridView1.Rows.Add(4);
    }

    private void chkItems_CheckedChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
            if (chk.Value == chk.FalseValue || chk.Value == null)
            {
                chk.Value = chk.TrueValue;
            }
            else
            {
                chk.Value = chk.FalseValue;
            }

        }
        dataGridView1.EndEdit();
    }
}
25
Mark Hall

Ich habe meine eigene Version eines Kontrollkästchens erstellt, um eine DataGridViewCheckBoxColumn zu steuern, als ich sah, dass dieser Beitrag nicht wirklich beantwortet wurde. So legen Sie den geprüften Status einer DataGridViewCheckBoxCell fest:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    dataGridView1.Rows[row.Index].SetValues(true);
}

Für alle anderen, die versuchen, das Gleiche zu erreichen, habe ich Folgendes entwickelt. 

Dadurch verhalten sich die beiden Steuerelemente wie die Checkbox-Spalte in Google Mail. Die Funktionalität für Maus und Tastatur bleibt erhalten.

using System;
using System.Windows.Forms;

namespace Check_UnCheck_All
{
    public partial class Check_UnCheck_All : Form
    {
        public Check_UnCheck_All()
        {
            InitializeComponent();
            dataGridView1.RowCount = 10;
            dataGridView1.AllowUserToAddRows = false;
            this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvApps_CellContentClick);
            this.dataGridView1.CellMouseUp += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.myDataGrid_OnCellMouseUp);
            this.dataGridView1.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.myDataGrid_OnCellValueChanged);
            this.checkBox1.Click += new System.EventHandler(this.checkBox1_Click);
        }

        public int chkInt = 0;
        public bool chked = false;

        public void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == dataGridView1.Rows[0].Index && e.RowIndex != -1)
            {
                DataGridViewCheckBoxCell chk = dataGridView1.Rows[e.RowIndex].Cells[0] as DataGridViewCheckBoxCell;

                if (Convert.ToBoolean(chk.Value) == true) chkInt++;
                if (Convert.ToBoolean(chk.Value) == false) chkInt--;
                if (chkInt < dataGridView1.Rows.Count && chkInt > 0)
                {
                    checkBox1.CheckState = CheckState.Indeterminate;
                    chked = true;
                }
                else if (chkInt == 0)
                {
                    checkBox1.CheckState = CheckState.Unchecked;
                    chked = false;
                }
                else if (chkInt == dataGridView1.Rows.Count)
                {
                    checkBox1.CheckState = CheckState.Checked;
                    chked = true;
                }
            }
        }
        public void myDataGrid_OnCellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
        {
            // End of edition on each click on column of checkbox
            if (e.ColumnIndex == dataGridView1.Rows[0].Index && e.RowIndex != -1)
            {
                dataGridView1.EndEdit();
            }
            dataGridView1.BeginEdit(true);
        }
        public void dgvApps_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dataGridView1.CurrentCell.GetType() == typeof(DataGridViewCheckBoxCell))
            {
                if (dataGridView1.CurrentCell.IsInEditMode)
                {
                    if (dataGridView1.IsCurrentCellDirty)
                    {
                        dataGridView1.EndEdit();
                    }
                }
                dataGridView1.BeginEdit(true);
            }
        }
        public void checkBox1_Click(object sender, EventArgs e)
        {
            if (chked == true)
            {
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
                    if (chk.Value == chk.TrueValue)
                    {
                        chk.Value = chk.FalseValue;
                    }
                    else
                    {
                        chk.Value = chk.TrueValue;
                    }
                }
                chked = false;
                chkInt = 0;
                return;
            }
            if (chked == false)
            {
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    dataGridView1.Rows[row.Index].SetValues(true);
                }
                chked = true;
                chkInt = dataGridView1.Rows.Count;
            }
        }
    }
}
5
KevinD

Der Code, den Sie hier versuchen, kippt die Zustände (wenn wahr, dann falsch, umgekehrt) der Kontrollkästchen unabhängig von dem vom Benutzer ausgewählten Kontrollkästchen , da hier das foreach ist Auswählen jedes checkbox und Ausführen der Operationen.

Um dies zu verdeutlichen, speichern Sie das Kontrollkästchen index von vom Benutzer ausgewählt, bevor Sie die Operation foreach ausführen, und rufen Sie das Kontrollkästchen nach der Operation foreach auf, indem Sie es erwähnen den gespeicherten Index und überprüfen Sie es (In Ihrem Fall machen Sie es True - ich denke).

Das ist nur Logik und ich bin mir verdammt sicher, dass es richtig ist. Ich werde versuchen, wenn möglich einen Beispielcode zu implementieren.

Ändern Sie Ihr foreach in etwa so:

    //Store the index of the selected checkbox here as Integer (you can use e.RowIndex or e.ColumnIndex for it).
    private void chkItems_CheckedChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in datagridview1.Rows)
        {
            DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1];
            if (chk.Selected == true)
            {
                chk.Selected = false;
            }
            else
            {
                chk.Selected = true;
            }
        }
    }
    //write the function for checking(making true) the user selected checkbox by calling the stored Index

Mit der obigen Funktion werden alle Kontrollkästchen aktiviert, einschließlich des vom Benutzer ausgewählten Kontrollkästchens. Ich denke das ist was du willst ..

3
Mr_Green

Einfacher Code für Sie wird es funktionieren

private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (dgv.CurrentRow.Cells["ColumnNumber"].Value != null && (bool)dgv.CurrentRow.Cells["ColumnNumber"].Value)
    {
        dgv.CurrentRow.Cells["ColumnNumber"].Value = false;
        dgv.CurrentRow.Cells["ColumnNumber"].Value = null;
    }
    else if (dgv.CurrentRow.Cells["ColumnNumber"].Value == null )
    {
        dgv.CurrentRow.Cells["ColumnNumber"].Value = true;
    }
}
2
user6240633

Probieren Sie den folgenden Code aus, der funktionieren sollte 

private void checkBox2_CheckedChanged(object sender, EventArgs e) 
{
    if (checkBox2.Checked == false)
    {
        foreach (DataGridViewRow row in dGV1.Rows)
        {
            DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
            chk.Value = chk.TrueValue;
        }
    }
   else if (checkBox2.Checked == true)
    {
        foreach (DataGridViewRow row in dGV1.Rows)
        {
            DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
            chk.Value = 1;
            if (row.IsNewRow)
            {
                chk.Value = 0;
            }
        }
    }
}

Der folgende Code funktioniert einwandfrei 

Aktivieren/Deaktivieren Sie eine Kontrollkästchen-Spalte im Datenraster mithilfe des Kontrollkästchens CONTROL 

    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox2.Checked == false)
        {
            foreach (DataGridViewRow row in dGV1.Rows)
            {
                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];

                    chk.Value = chk.TrueValue;
            }
       }
       else if(checkBox2.Checked==true)
       {
            foreach (DataGridViewRow row in dGV1.Rows)
            {
                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
                chk.Value = 1;
                if (row.IsNewRow)
                {
                    chk.Value = 0;
                }
            }
        }
    }

Sie können diesen Code in Ihrem CellClick-Ereignis für das Raster verwenden, um das Kontrollkästchen für die Checkbox oder das Kontrollkästchen für die Zelle zu aktivieren:

private void Grid_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 0)
        {
            Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = (Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null ? true : (!(bool)Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value));
        }
    }
1
soheil mohebbi

Ich benutze das CellMouseUp-Ereignis. Ich überprüfe die richtige Spalte

if (e.ColumnIndex == datagridview.Columns["columncheckbox"].Index)

Ich habe die eigentliche Zelle auf eine DataGridViewCheckBoxCell gesetzt

dgvChkBxCell = datagridview.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewCheckBoxCell;

Überprüfen Sie anschließend mithilfe von EditingCellFormattedValue, ob die Option aktiviert ist

if ((bool)dgvChkBxCell.EditingCellFormattedValue) { }

Sie müssen mithilfe des KeyUp-Ereignisses nach Tastatureingaben suchen und die .value -Eigenschaft überprüfen. Außerdem müssen Sie überprüfen, ob der Spaltenindex von CurrentCell mit der Spalte des Kontrollkästchens übereinstimmt. Die Methode bietet weder e.RowIndex noch e.ColumnIndex.

0
Tom Wood
// here is a simple way to do so

//irate through the gridview
            foreach (DataGridViewRow row in PifGrid.Rows)
            {
//store the cell (which is checkbox cell) in an object
                DataGridViewCheckBoxCell oCell = row.Cells["Check"] as DataGridViewCheckBoxCell;

//check if the checkbox is checked or not
                bool bChecked = (null != oCell && null != oCell.Value && true == (bool)oCell.Value);

//if its checked then uncheck it other wise check it
                if (!bChecked)
                {
                    row.Cells["Check"].Value = true;

                }
                else
                {
                    row.Cells["Check"].Value = false;

                }
            }
0
Vikas Bansal

Alle Castings verursachen Fehler, nichts, was ich hier versucht habe, ich habe versucht, es zu machen.

  foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.Cells[0].Value != null && (bool)row.Cells[0].Value)
            {
                Console.WriteLine(row.Cells[0].Value);
            }

        }
0
Syv Development

Ich hatte das gleiche Problem, und selbst mit den hier bereitgestellten Lösungen funktionierte es nicht. Die Kontrollkästchen würden sich einfach nicht ändern, ihr Wert würde null bleiben. Ich habe Ewigkeiten gebraucht, um meine Dummheit zu realisieren: 

Es stellte sich heraus, dass ich form1.PopulateDataGridView(my data) auf der abgeleiteten Form-Klasse Form1 aufgerufen hatte, bevor ich form1.Show() aufgerufen habe. Wenn ich die Reihenfolge geändert habe, das heißt zuerst Show() aufrufen, dann die Daten lesen und die Kontrollkästchen ausfüllen, blieb der Wert nicht null.

0
Kees Boon

Während alle anderen Antworten richtig sind, füge ich eine weitere einfache Option hinzu, die für mich funktioniert hat:

var r = dataGridView.Rows[rIndex];
var c = r.Cells[cIndex];
var value = (bool) c.Value; 
c.Value = !value;

Komprimiert:

var r = dataGridView.Rows[rIndex];
r.Cells[cIndex].Value = !((bool) r.Cells[cIndex].Value)

Solange sich cIndex auf eine Zelle vom Typ DataGridViewCheckBoxCell bezieht, funktioniert dies einwandfrei. Hoffe das hilft jemandem.

Hier ist ein weiteres Beispiel, das Sie ausprobieren können

private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == dataGridView.Columns["Select"].Index)
        {
            dataGridView.EndEdit();

            if ((bool)dataGridView.Rows[e.RowIndex].Cells["Select"].Value)
            {
                //-- checking current select, needs to uncheck any other cells that are checked
                foreach(DataGridViewRow row in dataGridView.Rows)
                {
                    if (row.Index == e.RowIndex)
                    {
                        dataGridView.Rows[row.Index].SetValues(true);
                    }
                    else
                    {
                        dataGridView.Rows[row.Index].SetValues(false);
                    }
                }
            }
        }
    }
0
ondrovic

sie können diesen Code ausprobieren:

DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)dataGridView1.CurrentRow.Cells[0];
                dataGridView1.BeginEdit(true);
                if (chk.Value == null || (int)chk.Value == 0)
                {
                    chk.Value = 1;
                }
                else
                {
                    chk.Value = 0;
                }
                dataGridView1.EndEdit();
0
Ba Dao

Der folgende Code ermöglicht es dem Benutzer, die Kontrollkästchen in der DataGridView zu deaktivieren, wenn die Zellen im Code erstellt werden

private void gvData_CellClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)gvData.Rows[e.RowIndex].Cells[0];

    if (chk.Value == chk.TrueValue)
    {
        gvData.Rows[e.RowIndex].Cells[0].Value = chk.FalseValue;
    }
    else
    {
        gvData.Rows[e.RowIndex].Cells[0].Value = chk.TrueValue;
    }

}
0
SamekaTV