我创建了一个用户控件,它是一个带有一些验证的文本框,我将动态添加到网格中。网格的数据源来自数据集。
因此我循环遍历网格并将控件加载到我想要的网格中的特定单元格。
我遇到的问题是因为我正在动态添加此控件,这会以某种方式阻止验证工作。
用户控制
<%@ 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。但我的验证不起作用。
任何人都有想法为什么会这样?
由于
答案 0 :(得分:1)
每次回发都会丢失动态创建的控件。我建议将usercontol添加到您的标记中,以防止出现以下情况:
人们经常遇到没有显示用户控件的问题。
Usercontrols事件未被触发,因为标记中不存在用户控件而是动态生成。
速度(页面大小)没有区别。您可以根据需要切换可见性。
更清洁,更优雅的解决方案。
无论如何,如果您确实需要动态添加表格,请查看此问题Dynamic Controls and Postback和本教程http://www.4guysfromrolla.com/articles/092904-1.aspx