मैं DataGridView
को चेकबॉक्सों की एक श्रृंखला के साथ क्षैतिज और लंबवत लेबल के साथ बना रहा हूं। कोई भी लेबल जो समान हैं, चेकबॉक्स निष्क्रिय होंगे, और मैं केवल प्रत्येक संयोजन के लिए मान्य होने के लिए दो "चेक" में से एक चाहता हूं। निम्नलिखित स्क्रीनशॉट दिखाता है कि मेरे पास क्या है: DataGridView http://i46.tinypic.com/2e4m3pz.pngडेटाग्रिड व्यू चेकबॉक्स घटनाएं
निचले आधे भाग पर चेक किए गए कुछ भी, मैं ऊपरी भाग पर संयुक्त राष्ट्र की जांच करना चाहता हूं। तो यदि [quux, स्पैम] (या [7, 8] शून्य-आधारित समन्वय के लिए) चेक किया गया है, तो मुझे [स्पैम, quux] ([8, 7]) अन-चेक किया गया है। क्या मैं अब तक है निम्नलिखित है:
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;
}
}
समस्या आता है कि सेल मूल्य हमेशा "के पीछे एक" प्रतीत हो रहा है बदल गया है, जहां आप वास्तव में अगर मैं CellValueChanged
घटना का उपयोग क्लिक करें, और मुझे यकीन है कि नहीं कर रहा हूँ वर्तमान सेल कैसे प्राप्त करें यदि मैं "गंदे" राज्य में हूं क्योंकि curCell एक शून्य के रूप में आता है (वर्तमान सेल पता किसी भी तरह गलत है, लेकिन मैंने कोशिश नहीं की और उस मान को प्राप्त नहीं किया) जिसका अर्थ है कि पथ isn ' बिल्कुल काम नहीं कर रहा हूँ।
असल में, मुझे सही बूलियन मूल्य के साथ "दाएं" पता कैसे मिलता है ताकि मेरा फ़्लिपिंग एल्गोरिदम काम करेगा?
हाँ !! ... मेरी खोज खत्म हो गई है ... अब मैं खुशी से बाद में रह सकता हूं। धन्यवाद। – zmaster