【问题标题】:Dynamically created user control validation not working动态创建的用户控件验证不起作用
【发布时间】:2012-06-29 18:59:35
【问题描述】:

我创建了一个用户控件,它是一个带有一些验证的文本框,我将其动态添加到网格中。网格的数据源来自数据集。

因此,我正在遍历我的网格并将控件加载到网格中我希望它们所在的特定单元格。

我遇到的问题是因为我正在动态添加此控件,这会以某种方式阻止验证工作。

用户控制

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextboxPercentage.ascx.cs"
Inherits="tesco.User_Controls.TextboxPercentage" %>
<%@ register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="cc2" %>

<div id="percentage">

    <asp:TextBox runat="server" ID="txtPercentage" Width="40" onfocus="if (this.value=='0') this.value='';" onblur="if
    (this.value=='') this.value='0';" Text="0"></asp:TextBox>
    <asp:Label runat="server" ID="lbl1">%</asp:Label>

    <asp:RegularExpressionValidator ID="Reg_percentage" ControlToValidate="txtPercentage"
    runat="server" ErrorMessage="Numbers with 18 digits and two decimal values only. eg.9999999.99"
    Display="None" ValidationExpression="\b\d{1,18}\.?\d{0,2}" Enabled="true"></asp:RegularExpressionValidator>
    <asp:RangeValidator ID="rval_percentage" ControlToValidate="txtPercentage" MinimumValue="0"
    MaximumValue="100" Type="Double" runat="server" ErrorMessage="Numbers between 0-100 only" Display="None" ></asp:RangeValidator>
    <cc2:ValidatorCalloutExtender ID="vce_percentage_value" runat="server" TargetControlID="Reg_percentage"
    Enabled="True">
</cc2:ValidatorCalloutExtender>
    <cc2:ValidatorCalloutExtender ID="vce_percentage_range" runat="server" TargetControlID="rval_percentage"
    Enabled="True">
</cc2:ValidatorCalloutExtender>

背后的代码

GridView1.DataSource = ds;

GridView1.DataBind();

AssignCellCoordinates();


private void AssignCellCoordinates()
    {
        // Create IDs for Grid
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            GridView1.Rows[i].ID = "r" + i; // Row ID
            for (int ii = 0; ii < GridView1.Rows[i].Cells.Count; ii++)
            {
                GridView1.Rows[i].Cells[ii].ID = "c" + ii; // Cell ID

                if (GridView1.Rows[i].ID == "r25" || GridView1.Rows[i].ID == "r26" || GridView1.Rows[i].ID == "r27")
                {
                    if (GridView1.Rows[i].Cells[ii].ID != "c0")
                    {
                        User_Controls.TextboxPercentage txtPerc = (User_Controls.TextboxPercentage)LoadControl("~/User_Controls/TextboxPercentage.ascx");
                        GridView1.Rows[i].Cells[ii].Controls.Add(txtPerc);
                    }
                }
            }
        }
    }

如您所见,我循环遍历一行,对于每一行迭代,我添加单元格 ID,直到达到一行的总单元格。在我的内部循环中,如果控件具有特定的单元格 ID,则添加控件。但我的验证不起作用。

有人知道为什么会这样吗?

谢谢

【问题讨论】:

    标签: c# asp.net user-controls


    【解决方案1】:

    动态创建的控件在每次回发时都会丢失。我建议将 usercontol 添加到您的标记中以防止出现以下情况:

    1. 人们经常遇到用户控件不显示的问题。

    2. 用户控件事件未触发,因为用户控件不存在于标记中,而是动态生成的。

    3. 速度(页面大小)没有差异。您可以根据需要切换那里的可见性。

    4. 更清洁、更优雅的解决方案。

    无论如何,如果你真的需要动态添加表格,看看这个问题Dynamic Controls and Postback和这个教程http://www.4guysfromrolla.com/articles/092904-1.aspx

    【讨论】:

    • 但是在回发时,页面使用的方法被再次调用,因此网格将从数据集中获取数据,循环将再次运行,用户控件将被添加到正确的单元格中。当页面加载它只是不起作用的验证时,用户控件就在那里。
    • 您是否为要验证的控件设置了正确的 ID?
    • 是的,如果我在标记中硬编码用户控件,则验证有效。我在我的用户控件中测试了验证控件,它们的行为符合预期。动态控件 ID 是自动生成的。
    • 尝试自己分配 ID,有时 id 会在控件的 id 前面加上,也许这就是这里发生的事情。
    • 我发现这是一个 ie 问题,但我仍然不知道为什么这不起作用。在 Firefox 中运行良好。
    猜你喜欢
    • 2018-02-27
    • 2018-04-22
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多