【问题标题】:What is wrong with these .NET Controls?这些 .NET 控件有什么问题?
【发布时间】:2012-05-08 07:17:15
【问题描述】:

代码:

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

它说“我不能将 HtmlGenericControl 隐式转换为 HiddenField”。另外,如果我写了(HiddenField)div.Controls.OfType&lt;HtmlGenericControl&gt;().LastOrDefault(),它也不起作用。

div 的最后一个元素(即 HtmlGenericControl)始终是 HiddenField 元素。

为什么?我哪里错了?

【问题讨论】:

  • ...你知道显式和隐式转换的区别吗?
  • 当你想找到最后一个HiddenField时,为什么不用div.Controls.OfType&lt;HiddenField&gt;()来代替呢?

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


【解决方案1】:

不应该是这样的

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

【讨论】:

    【解决方案2】:
    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;
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果您知道它是一个 HiddenField,这应该可以工作:

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

        【讨论】:

        • 他相信 知道 ,因为他做了演员......as 和演员只是在安全方式上有所不同 - 没有别的!您的解决方案是正确的,但描述是错误的!
        【解决方案5】:

        我认为你应该先检查它是否是隐藏字段

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-16
          • 1970-01-01
          • 2013-11-06
          • 2016-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多