2012-06-29 81 views
1

我創建了一個用戶控件,它是一個帶有一些驗證的文本框,我將其動態添加到網格中。網格的數據源來自數據集。動態創建的用戶控件驗證不起作用

因此,我正在循環瀏覽我的網格並將控件加載到網格中的特定單元格,我希望它們成爲。

我有的問題是因爲我動態地添加這個控件,這不知何故停止驗證工作。

用戶控制

<%@ 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。但我的驗證不起作用。

任何人都有想法,爲什麼?

謝謝

回答

1

動態創建的控件在每次回發時都會丟失。我建議加入usercontol到您的標記,以避免以下情況:

  1. 人們經常遇到的問題有用戶控件不顯示。

  2. Usercontrols事件未被觸發,因爲usercontrols不存在於標記中而是動態生成。

  3. 速度(頁面大小)沒有差異。根據您的需要,您可以切換可視性。

  4. 更清潔,優雅的解決方案。

不管怎麼說,如果你真的需要添加表動態,看看這個問題Dynamic Controls and Postback本教程http://www.4guysfromrolla.com/articles/092904-1.aspx

+0

但在回發在頁面中使用的方法被再次調用,因此網格將抓住從數據數據集和循環將再次運行,用戶控件將被添加到正確的單元格中。用戶控件在頁面加載時只有驗證不起作用。 –

+0

您是否爲要驗證的控件設置了正確的ID? –

+0

是的,如果我在標記中對用戶控件進行硬編碼驗證的工作。我測試了我的用戶控件中的驗證控件,它們的行爲如預期。動態控件ID是自動生成的。 –