无法转换类型为#System; Web.UI.LiteralControl'的对象键入' System.Web.UI.WebControls.RequiredFieldValidator'。

时间:2017-07-19 13:09:07

标签: c# asp.net validation foreach

我意识到有类似的问题可以通过ID引用和.FindControl(ID)解决,但是这个解决方案对我来说不起作用,因为我正在进行迭代设置。

情况就是这样。我有一个4列表。其中一个是隐藏的,只根据日期显示。为了显示列,我遍历表格和单元格使它们可见。如果显示列,此过程还需要激活每个单元格所需的RequiredFieldValidator。以下是.aspx

中的示例单元格
<asp:TableCell runat="server" visible="false">
<div class="pull-right form-group form-inline">
<asp:Label ID="Label28" CssClass="control-label" runat="server" Text="Sales Actual:"></asp:Label>
<asp:TextBox ID="txtStationarySalesFull" runat="server" CssClass="form-control input-sm form-control-inline-small"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator38" Display="Dynamic" CssClass="help-block" runat="server" ErrorMessage="" ValidationGroup="Form" ControlToValidate="txtStationarySalesFull" Enabled="false"></asp:RequiredFieldValidator>
</div>
</asp:TableCell> 

为了达到这个目的,我正在尝试:

foreach (TableRow row in tblGoals.Rows)
        {
            foreach (TableCell cell in row.Cells)
            {
                cell.Visible = true;

                foreach (RequiredFieldValidator fv in cell.Controls)
                {
                    fv.Enabled = true;
                }
            }

        }

但这并不起作用。它会发现控件集合很好,但是在返回的5个控件中,集合中没有RequiredFieldValidators,它失败了:

无法转换类型为#System; Web.UI.LiteralControl&#39;的对象键入&#39; System.Web.UI.WebControls.RequiredFieldValidator&#39;。

控件集合包含两个LiteralControls,一个TextBox和两个Text值。奇怪的是第二个文本=&#34;&#34;实际上是我要找的requiredfieldvalidator。

任何想法我如何才能真正做到这一点?我宁愿避免通过ID引用每个控件,因为这主要是重用代码。

我可以想到一个涉及

的混乱版本
foreach (TableCell cell in row.Cells)
            {
                cell.Visible = true;
                if (cell.Controls.Count > 4) {
                    RequiredFieldValidator fv = (RequiredFieldValidator)cell.Controls[3];
                    fv.Enabled = true;
                }

            }

但这并不能解决所有案件。有些单元格中需要启用验证器的控件较少。

2 个答案:

答案 0 :(得分:2)

林克,曾经救援过。 cell.Controls.OfType<RequiredFieldValidator>应该返回该集合中RequiredFieldValidator类型的所有控件。

https://msdn.microsoft.com/en-us/library/bb360913(v=vs.110).aspx

答案 1 :(得分:0)

继@ Will的回答,你的循环可能会变成这样:

foreach (TableRow row in tblGoals.Rows)
        {
            foreach (TableCell cell in row.Cells)
            {
                cell.Visible = true;

                foreach (RequiredFieldValidator fv in cell.Controls.OfType<RequiredFieldValidator>)
                {
                    fv.Enabled = true;
                }
            }

        }

在第三个foreach循环中,您必须仅过滤RequiredFieldValidator类型的控件