Sto creando uno DataGridView
con una serie di checkbox in esso con le stesse etichette in senso orizzontale e verticale. Eventuali etichette uguali, le caselle di controllo saranno inattive e desidero solo che uno dei due "assegni" per ogni combinazione sia valido. La seguente schermata mostra quello che ho: DataGridView http://i46.tinypic.com/2e4m3pz.pngEventi DataGridView CheckBox
Qualsiasi cosa che viene controllata nella metà inferiore, voglio UN-checked sulla parte superiore. Quindi se [quux, spam] (o [7, 8] per le coordinate basate su zero) è selezionato, voglio che [spam, quux] ([8, 7]) non sia spuntato. Quello che ho finora è la seguente:
dgvSysGrid.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
dgvSysGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
string[] allsysNames = { "heya", "there", "lots", "of", "names", "foo", "bar", "quux", "spam", "eggs", "bacon" };
// Add a column for each entry, and a row for each entry, and mark the "diagonals" as readonly
for (int i = 0; i < allsysNames.Length; i++)
{
dgvSysGrid.Columns.Add(new DataGridViewCheckBoxColumn(false));
dgvSysGrid.Columns[i].HeaderText = allsysNames[i];
dgvSysGrid.Rows.Add();
dgvSysGrid.Rows[i].HeaderCell.Value = allsysNames[i];
// Mark all of the "diagonals" as unable to change
DataGridViewCell curDiagonal = dgvSysGrid[i, i];
curDiagonal.ReadOnly = true;
curDiagonal.Style.BackColor = Color.Black;
curDiagonal.Style.ForeColor = Color.Black;
}
// Hook up the event handler so that we can change the "corresponding" checkboxes as needed
//dgvSysGrid.CurrentCellDirtyStateChanged += new EventHandler(dgvSysGrid_CurrentCellDirtyStateChanged);
dgvSysGrid.CellValueChanged += new DataGridViewCellEventHandler(dgvSysGrid_CellValueChanged);
}
void dgvSysGrid_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
Point cur = new Point(e.ColumnIndex, e.RowIndex);
// Change the diagonal checkbox to the opposite state
DataGridViewCheckBoxCell curCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.X, cur.Y];
DataGridViewCheckBoxCell diagCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.Y, cur.X];
if ((bool)(curCell.Value) == true)
{
diagCell.Value = false;
}
else
{
diagCell.Value = true;
}
}
/// <summary>
/// Change the corresponding checkbox to the opposite state of the current one
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void dgvSysGrid_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
Point cur = dgvSysGrid.CurrentCellAddress;
// Change the diagonal checkbox to the opposite state
DataGridViewCheckBoxCell curCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.X, cur.Y];
DataGridViewCheckBoxCell diagCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.Y, cur.X];
if ((bool)(curCell.Value) == true)
{
diagCell.Value = false;
}
else
{
diagCell.Value = true;
}
}
Il problema arriva è che il valore della cella cambiato sempre sembra essere "uno dietro" dove realmente sceglie se uso l'evento CellValueChanged
, e io non sono sicuro come ottenere la cella corrente se sono nello stato "sporco" quando curCell viene inserito come null (suggerendo che l'indirizzo corrente della cella sia sbagliato in qualche modo, ma non ho provato a ottenere quel valore) che significa che il percorso non è sto lavorando affatto
In sostanza, come faccio a ottenere l'indirizzo "giusto" con il valore booleano corretto in modo che il mio algoritmo di flipping funzioni?
SI !! ... la mia ricerca è finita ... Ora posso vivere felice e contento. Grazie. – zmaster