我有一个DataGridView,我想遍历DataGridView中所有捕获周围单元格值的单元格。我在DataGridView的边缘上得到了预期的超出范围的错误,但是我无法找到一种方法来首先测试它们的存在?
下面,我将周围细胞的选定状态存储到bool数组中,但是该细胞不存在,那么如何测试或处理呢?
/root/
/projects/
/project1/
index.php
/project2/
index.php
/project3/
index.php
index.php
.htaccess
任何帮助都将不胜感激。
答案 0 :(得分:0)
我猜您可能使这个问题复杂化了。您的评论……
“但我无法找到一种方法来首先测试它们的存在” …
如果某物“不存在”,则很难测试是否存在!这就是为什么如果不检查单元格周围的这些“不存在”的单元格就会出现Out Of Range
错误的原因。显然,任何边缘单元都将属于此类。例如,对于任何第一列单元格,它将包含三(3)个“不存在”单元格,左上(TL),左下(BL)和左(L)。最后一列TR,BR和R同样如此。
鉴于如果我们尝试获取它们的值,这些单元将超出“范围”……检查这些单元并返回类似“ OOR”的值很重要,这意味着周围的单元“不存在”。 / p>
我建议一种简单的方法,该方法接受单元格行和col索引,并返回显示周围单元格值的字符串列表。对于“不存在”的单元格,使用字符串“ OOR”(超出范围)表示周围不存在的单元格。
为简化此操作,我建议使用第二种方法,该方法给定行和列的索引,它将仅返回单元格的值。在这种方法中,确保给定的行和列索引在网格的行和列范围内是很简单的。它可能看起来像下面的样子……
private string GetCellValue(int row, int col) {
if (row >= 0 && row < dataGridView1.Rows.Count && col >= 0 && col < dataGridView1.Columns.Count) {
if (dataGridView1.Rows[row].Cells[col].Value != null)
return dataGridView1.Rows[row].Cells[col].Value.ToString();
else
return "null";
}
else {
return "OOR";
}
}
首先是显而易见的检查;如果行索引大于或等于0,并且行索引也小于网格中的总行数。列索引也是如此。如果行索引或col索引均未通过这些测试……我们知道它是“不存在”的单元格,只需返回类似“ OOR”的内容。如果行索引和列索引有效,那么我们只需返回单元格值,显然检查像新行一样的空单元格。
鉴于此方法,获取网格中任何单元格的周围值应该相当容易。下面,List<string>
用于收集周围的单元格值。给定一个单元格的行和列索引,它将返回一个字符串列表,这样每个字符串都将列出一个周围的单元格,左上角单元格的示例“ TL->单元格值”,“ TR->单元格值”,“ T->调用值”等。这意味着我们需要调用八(8)次以上的方法,一次用于TL,TR,T,B,L,R,BL,BR。将返回的字符串添加到周围的单元格列表中。可能看起来像下面的样子。
private List<string> GetSurroundingCells(int row, int col) {
List<string> surroundingCells = new List<string>();
surroundingCells.Add("T->" + GetCellValue(row - 1, col));
surroundingCells.Add("TL->" + GetCellValue(row - 1, col - 1));
surroundingCells.Add("TR->" + GetCellValue(row - 1, col + 1));
surroundingCells.Add("B->" + GetCellValue(row + 1, col));
surroundingCells.Add("BL->" + GetCellValue(row + 1, col - 1));
surroundingCells.Add("BR->" + GetCellValue(row + 1, col + 1));
surroundingCells.Add("L->" + GetCellValue(row, col - 1));
surroundingCells.Add("R->" + GetCellValue(row, col + 1));
return surroundingCells;
}
为了进行测试,将具有三(3)个文本列和多行DataGridView
的{{1}}放到表单上。网格TextBox
事件已连接,并且在触发时将使用网格SelectionChanged
在文本框中列出周围的单元格值。我希望这会有所帮助。
CurrentCell