我的目的是循环浏览GridView中每一行的所有字段。这些字段是CheckBox
类型,TextBox
和DropDownList
。如果发现其中一个未选中/空/selectionEndex = 0,我将其添加到emptyControls
列表中。
foreach (GridViewRow gvRow in gvProxyEntry.Rows)
{
List<object> emptyControls = new List<object>();
foreach (TableCell cell in gvRow.Cells)
{
Type controlType = cell.Controls[0].GetType();
if (controlType == typeof(CheckBox))
{
CheckBox chkBox = (CheckBox)cell.Controls[0];
if (chkBox.Checked == false)
{
emptyControls.Add(chkBox);
}
}
...
}
...
}
我的问题是if-else
检查一直无法检测到复选框(基于上面的代码段)。
我有一个猜测为什么失败。进行调试,我发现controlType
变量始终为System.Web.UI.LiteralControl
类型。
如何在不使用字段ID的情况下正确获取所有字段的正确类型?我不想使用该字段的ID的原因是,如果将新字段添加到该行中,将来可以防止代码更改。
如果控件嵌套在其他控件中,则您将无法轻松找到它。我相信您在设计时知道控件的ID。
如果是这样,您可以使用以下FindConconConcontrolecursive Helper方法。
助手方法
public static Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
return root;
return root.Controls.Cast<Control>()
.Select(c => FindControlRecursive(c, id))
.FirstOrDefault(c => c != null);
}
用法
foreach (TableCell cell in gvRow.Cells)
{
var checkBox = FindControlRecursive(cell, "CheckBox1") as CheckBox;
if(checkBox != null)
{
// Do something
}
}
使用linq您可以使用一行
获得所有复选框var unCheckedCheckBoxes = gvProxyEntry.Rows.OfType<TableRow>()
.SelectMany(row => row.Cells.OfType<TableCell>()
.SelectMany(cell => cell.Controls.OfType<CheckBox>())).Where(c=>!c.Checked).ToList();
相同的方式,您可以通过更改类型和Where条件
解决方案1
显然,我是针对cell.Control[0]
的,这是cell.Controls
中错误的控制类型。因此,我添加了另一个foreach循环,以通过cell.Controls
循环以获取我想要的正确控制类型。
foreach (GridViewRow gvRow in gvProxyEntry.Rows)
{
List<object> emptyControls = new List<object>();
foreach (TableCell cell in gvRow.Cells)
{
foreach(Control c in cell.Controls)//newly added foreach loop
{
Type controlType = c.GetType();
if (controlType == typeof(CheckBox))
{
CheckBox chkBox = (CheckBox)c;
if (chkBox.Checked == false)
{
emptyControls.Add(chkBox);
}
}
...
}
...
}
...
}
解决方案2
for Linq用户