如何正确获取GridView中的字段类型



我的目的是循环浏览GridView中每一行的所有字段。这些字段是CheckBox类型,TextBoxDropDownList。如果发现其中一个未选中/空/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用户

最新更新