我已經設定了一個表格,其中我在右欄中有一列復選框。如果相應的復選框列未選中且選中時可編輯,則左列包含只讀資料。由于資料列相互依賴以進行計算,因此我需要 (2) 一次檢查可編輯的資料列行。我希望將可復選框限制為任何(2)個,其余的框在至少一個已選中的框未選中之前不可選中。我認為最好的方法是保持選中框的總數并以某種方式限制這一點,但我被困在如何實作這一點上。下面的代碼只輸出一個持久的 GlobalVar.NumChecked = -1 值。任何幫助或方向將不勝感激。
private void dgvParameters_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataGridView dgPG = dgvParameters;
if (e.RowIndex < 0) return;
GlobalVar.NumChecked = 0;
foreach (DataGridViewRow row in dgvParameters.Rows)
{
if (e.RowIndex < 0) return;
DataGridViewCheckBoxCell cell = row.Cells[5] as DataGridViewCheckBoxCell;
if (cell.Value == cell.TrueValue)
{
GlobalVar.NumChecked = 1;
break;
}
if (cell.Value != cell.TrueValue)
{
GlobalVar.NumChecked -= 1;
break;
}
}
label2.Text = Convert.ToString(GlobalVar.NumChecked); //Debug output
}
uj5u.com熱心網友回復:
不要等到單元格的Value變化才通過處理CellValueChanged事件。如果您已經有兩個選中的單元格,則通過呼叫該方法來處理CurrentCellDirtyStateChanged事件以取消分配新值 (true) 。CancelEdit
//
using System.Linq;
// ...
private void dgvParameters_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dgvParameters.CurrentCell is DataGridViewCheckBoxCell &&
dgvParameters.IsCurrentCellDirty &&
!(bool)dgvParameters.CurrentCell.FormattedValue)
{
var count = dgvParameters.Rows.Cast<DataGridViewRow>()
.SelectMany(r => r.Cells.OfType<DataGridViewCheckBoxCell>()
.Where(c => (bool)c.FormattedValue))
.Count();
if (count == 2) dgvParameters.CancelEdit();
}
}
如果網格中有多個DataGridViewCheckBoxColumn,則還需要在查詢中指定。
private void dgvParameters_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
int tarCol = 2;
if (dgvParameters.CurrentCell is DataGridViewCheckBoxCell &&
dgvParameters.CurrentCell.ColumnIndex == tarCol &&
dgvParameters.IsCurrentCellDirty &&
!(bool)dgvParameters.CurrentCell.FormattedValue)
{
var count = dgvParameters.Rows.Cast<DataGridViewRow>()
.SelectMany(r => r.Cells.OfType<DataGridViewCheckBoxCell>()
.Where(c => c.ColumnIndex == tarCol)
.Where(c => (bool)c.FormattedValue))
.Count();
if (count == 2) dgvParameters.CancelEdit();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/506800.html
