2017-12-31 106 views
1

enter image description here ich eine DataGridView mit CheckBox haben, nun meine Frage, wie richte ich ein Limit, wie viele CheckBoxchecked in etwa wie 3 sein kann? Ich habe bereits den Code zum Zählen, wie viele CheckBox überprüft wird. Ich bin neu im Programmieren und entschuldige mich für mein schlechtes Englisch.Limitprüfungen in Datagridview-CheckBox

private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
     bool isChecked = Convert.ToBoolean(DataGridView1.Rows[DataGridView1.CurrentCell.RowIndex].Cells[0].Value.ToString()); 

     if (isChecked) 
     { 
      num += 1; 
     } 
     else 
     { 
      num -= 1; 
     } 
     MessageBox.Show(num.ToString()); 
} 
+0

einen Breakpoint Setzen Sie auf num + = 1. Sie im Wesentlichen num + = 1 mit „if (num> = 3 ersetzt werden soll) theCheckbox.value = false; else num + = 1; " Ich bin momentan nicht in einer MS-Box, daher kann ich Ihnen nicht die genaue Syntax geben, aber Sie müssen lernen, wie Sie das selbst herausfinden können. Wenn die Ausführung am Haltepunkt gestoppt wurde, drücken Sie Strg, um das nächste Fenster zu öffnen. Geben Sie DataGridView1 ein und drücken Sie die Eingabetaste. Sie sehen das Objekt. Verfolgen Sie DataGridView1.Rows [DataGridView1.CurrentCell.RowIndex] .Cells [0] und sehen Sie sich an, was verfügbar ist. Wenn nichts vielversprechend aussieht, addiere .Value. Versuchen Sie, .Value auf false zu setzen. – NeedsAnswers

+0

Indem Sie im unmittelbaren Fenster herumspielen, können Sie die Eigenschaft finden, die Sie benötigen, die manchmal in einer scheinbar willkürlichen Anzahl von Schichten anderer Objekte vergraben wird. – NeedsAnswers

Antwort

1

In diesem Beispiel können Kontrollkästchen nur dreimal geändert werden. Bevor Sie in den Bearbeitungsmodus gehen, wird geprüft, ob das Kontrollkästchen dreimal geändert wurde. Wenn dies der Fall ist, wird der Bearbeitungsmodus abgebrochen. Bei jedem Commit wird ein Zähler in der Tag Eigenschaft der Zelle aktualisiert.

dataGridView1.CellBeginEdit += (sender , e) => 
{ 
    var dataGridViewCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
    if (dataGridViewCell.ValueType == typeof(bool)) 
    { 
     var checkedCount = dataGridViewCell.Tag is int ? (int)dataGridViewCell.Tag : 0; 
     e.Cancel = checkedCount == 3; 
    }     
}; 
dataGridView1.CellEndEdit += (sender , e) => 
{ 
    var dataGridViewCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
    if (dataGridViewCell.ValueType == typeof(bool)) 
    { 
     var checkedCount = dataGridViewCell.Tag is int ? (int)dataGridViewCell.Tag : 0; 
     dataGridViewCell.Tag = checkedCount + 1; 
    } 
}; 

Dieses Beispiel allowes nur 3 Kontrollkästchen im Netz geprüft:

public partial class Form1 : Form 
{ 
    private int _checkedCount; 

    public Form1() 
    { 
     InitializeComponent(); 

     dataGridView1.CellBeginEdit += (sender , e) => 
     { 
      var dataGridViewCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
      if (dataGridViewCell.ValueType == typeof(bool)) 
       e.Cancel = _checkedCount == 3; 
     }; 

     dataGridView1.CellValueChanged += (sender , e) => 
     { 
      var dataGridViewCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
      if (dataGridViewCell.ValueType == typeof(bool)) 
       _checkedCount += 1; 
     }; 
    } 
} 
+0

Soll ich diese auf einen Zuhörer setzen? – Dhenz

+0

Diese Ereignisse sollten nur einmal initialisiert werden. Sie können dies in den Konstruktor Ihres Formulars einfügen, direkt nach dem InitializeComponent(); Anruf – Sievajet

+0

Ich bekomme einen Fehler in der Int ich? i: 0; Es sagt – Dhenz