这些.NET控件有什么问题?

时间:2012-05-08 07:17:16

标签: c# asp.net .net user-controls webforms

代码:

foreach (HtmlGenericControl div in panelCategorieGuida.Controls.OfType<HtmlGenericControl>())
{
    HiddenField hf = div.Controls.OfType<HtmlGenericControl>().LastOrDefault();
}

它说“我不能隐式地将HtmlGenericControl转换为HiddenField”。此外,如果我写(HiddenField)div.Controls.OfType<HtmlGenericControl>().LastOrDefault()它也不起作用。

div的最后一个元素(也就是HtmlGenericControl)总是一个HiddenField元素。

为什么呢?我哪里错了?

5 个答案:

答案 0 :(得分:2)

不应该像

HiddenField hf = div.Controls.OfType<HiddenField>().LastOrDefault();

答案 1 :(得分:1)

foreach (var div in panelCategorieGuida.Controls.OfType<HtmlGenericControl>())
{
    var hf = div.Controls.OfType<HiddenField>().LastOrDefault();
}

您的初始代码只是执行了以下操作:

  • 将列表过滤为元素,类型为HtmlGenericControl
  • 取最后一个(或默认)
  • 将其投放到HiddenField(隐式和/或显式)

现在:除非最后一个HtmlGenericControl类型的元素不是真正的HiddenField,否则你将获得无效的强制转换异常。您可以将元素过滤到HiddenField(就像我做的那样),或者更确切地说是这个代码:

var hf = div.Controls.OfType<HtmlGenericControl>().LastOrDefault() as HiddenField;

这是一个“安全演员”......

答案 2 :(得分:1)

我认为@Pranay Rana是对的。 如果你的显式转换也失败了,我认为你需要检查你想要的元素是否是隐藏字段。 此外,您的代码有一些问题。在继续之前,您应该始终进行一些验证。如果没有,也许在测试阶段,您的代码运行良好。但它可能会在生产后期遇到一些错误。

答案 3 :(得分:0)

如果你知道它是一个HiddenField,这应该可行:

HiddenField hf = div.Controls.LastOrDefault() as HiddenField;

答案 4 :(得分:0)

我认为你应该首先检查它是否是一个隐藏的字段,或者不是这样的

if( div.Controls.OfType<HtmlGenericControl>().LastOrDefault() is HiddenField)
{
  /// rest of the processing code 
}

可能会解决您的问题,因为您获得的元素可能不是隐藏字段