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);
                    }
                }
            }
        }
    }

ご覧のとおり、行をループし、行の反復ごとに、1 つの行の合計セルに達するまでセル ID を追加します。内部ループ内で、特定のセル ID の場合にコントロールを追加します。しかし、私の検証は機能しません。

これがなぜなのか誰にも考えがありますか?

ありがとう

4

1 に答える 1

1

動的に作成されたコントロールは、ポストバックごとに失われます。次のシナリオを防ぐために、マークアップに usercontol を追加することをお勧めします。

  1. ユーザーコントロールが表示されないという問題に遭遇することがよくあります。

  2. ユーザーコントロールがマークアップに存在せず、代わりに動的に生成されるため、ユーザーコントロールイベントが発生しません。

  3. 速度(ページサイズ)に違いはありません。必要に応じて表示を切り替えることができます。

  4. はるかにクリーンでエレガントなソリューション。

とにかく、テーブルを動的に追加する必要がある場合は、この質問Dynamic Controls and Postbackとこのチュートリアルhttp://www.4guysfromrolla.com/articles/092904-1.aspxをご覧ください。

于 2012-06-29T10:59:35.097 に答える