it-swarm.com.de

DataGridView-Kontrollkästel - Wert und Funktionalität

Ich habe eine Checkbox-Spalte zu einer DataGridView in meinem C # -Formular hinzugefügt. Die Funktion muss dynamisch sein - Sie wählen einen Kunden aus, der alle seine Artikel anzeigt, die gewartet werden könnten, und Sie wählen aus, welche davon Sie diesmal warten möchten.

Auf jeden Fall fügt der Code jetzt eine Checkbox am Anfang der DGV hinzu. Was ich wissen muss, ist folgendes:

1) Wie mache ich es so, dass die gesamte Spalte standardmäßig "geprüft" wird? 2) Wie kann ich sicherstellen, dass ich nur Werte aus den "geprüften" Zeilen bekomme, wenn ich auf eine Schaltfläche direkt unterhalb der Schaltfläche klicke? DGV?

Hier ist der Code, um die Spalte einzufügen:

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

Also, was als nächstes? Jede Hilfe wäre sehr dankbar!

16
David Archer
  1. Es gibt keine Möglichkeit, dies direkt zu tun. Sobald Sie Ihre Daten im Raster haben, können Sie die Zeilen durchlaufen und jedes Kästchen wie folgt markieren:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. Das Click-Ereignis könnte ungefähr so ​​aussehen:

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

die beste Lösung, um herauszufinden, ob das Kontrollkästchen im Datenfenster aktiviert ist oder nicht.

14
Nazeer

Hier ist eine Antwort auf diese Frage

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

ich habe lange gebraucht, um herauszufinden, wie ich das machen kann, ohne alle Datensätze durchlaufen zu müssen. Ich habe eine gebundene Datagridview-Quelle, und alle Felder sind mit Ausnahme der Checkbox-Spalte gebunden. Daher habe/brauche ich keine Schleife, um jede Zeile hinzuzufügen, und ich wollte nicht nur für diesen Zweck eine erstellen. Nach vielen Versuchen habe ich es endlich verstanden. Und es ist eigentlich auch sehr einfach:

Zuerst fügen Sie Ihrem Projekt eine neue CS-Datei mit einer Zelle mit benutzerdefinierten Kontrollkästchen hinzu, z. 

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

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

Danach in Ihrer GridView, wo Sie die Checkbox-Spalte hinzufügen, tun Sie Folgendes:

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

Und das ist es! Jedes Mal, wenn Ihre Ankreuzfelder in einer neuen Zeile hinzugefügt werden, werden sie auf true gesetzt.

3
andzep

Wenn Sie es bei CellContentClick Event versuchen

Benutzen:

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

Wenn Sie eine Rasteransicht haben, die mehr als ein Kontrollkästchen enthält, sollten Sie dies versuchen.

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

Das ist ganz einfach

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

Wenn Ihre Spalte aufgrund der Bindung mit einem Recordset vom Typ BIT bereits erstellt wurde, ist der Typ der Spalte ohnehin Text. Die Lösung, die ich gefunden habe, ist, diese Spalte zu entfernen und sie durch eine "DataGridViewCheckBoxColumn" mit den gleichen Bindungsdaten zu ersetzen.

            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

wenn Sie diese Spalte in der SQL-Datenbank (Bit) als Datentyp erstellen, müssen Sie diesen Code bearbeiten

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

mit diesem

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

So testen Sie, ob die Spalte markiert ist oder nicht:

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

1) Wie mache ich es so, dass standardmäßig die gesamte Spalte "geprüft" wird?

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) Wie kann ich sicherstellen, dass ich nur Werte aus den "geprüften" Zeilen bekomme?

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