문제

마스터에서 생성 된 페이지의 콘텐츠 영역의 웹 사용자 컨트롤 내부에 동적으로 생성 된 식탁보의 동적으로 만든 텍스트 상자에 필요한 필드 바리 디터 및 regularexpressionvalidator를 추가해야 할 필요가 있습니다.

아마도 당신이 추측 할 수 있듯이 문제는 동적으로 생성 된 텍스트 상자를 보도록 ControlTovalidate 속성을 동적으로 설정하려고합니다.

일부 연구 후 코드는 다음과 같습니다.

  • 패널을 만듭니다 (내가 컨트롤 테이 도티 네이트와 유효성 검사기가 동일한 컨테이너 내에 있어야한다고 들었을 때). 이것은 원래 자리 표시 자 였지만 아래에 나열된 제안을 시도했습니다.
  • 텍스트 상자를 생성하고 ID를 설정합니다.
  • 텍스트 상자를 패널에 추가합니다.
  • 필수 필드 밸리 디터를 만듭니다.
  • ControlTovalidate의 ID를 설정합니다. 내가 사용하려고 시도한 값 :

    • 컨트롤의 ID
    • 컨트롤의 클라이언트
    • 추가 된 텍스트에 의해 접두사가 접두사의 ID가 서버가 웹 사용자 컨트롤의 자식 제어에 추가됩니다.
    • 클라이언트 ID도 같은 방식으로 수정되었습니다
    • 컨트롤의 이름 (Off Chance)
    • 서버가 컨트롤 이름에 추가되는 텍스트에 의해 접두사의 이름이 있습니다.
    • 새로운 제어 객체를 TextBox에 캐스팅 한 다음 ID 및 ClientID를 사용하기 위해 맞춤형 재귀 FindControl 메소드 사용
    • 통제의 고유 한
    • 위에서 설명한 것과 같은 접두사로 동일한 수정
  • 유효성 검사기를 패널에 추가하십시오.
  • 패널을 식탁보에 추가하십시오.

말할 것도없이 나는 여전히 검증기가 검증해야 할 제어를 "확인"하도록 설득 할 수 없으며 문제에 접근하는 새로운 방법이 완전히 벗어났습니다.

편집 : 추가 탐정 작업으로 인해 Page_Load 이벤트가 끝날 때까지 페이지가 문제가되지 않는 시점으로 이어졌습니다. 페이지 구축을위한 코드가 완료된 후 서버는 문제가있는 것 같습니다. 너무 일찍 대신 너무 늦게 이름 지정 컨테이너에 컨트롤을 추가하고 있는지 궁금해하기 시작했습니다.

제안이 있습니까?

도움이 되었습니까?

해결책

TextBox와 두 유효성 검사기가 포함 된 사용자 컨트롤을 작성하는 것은 어떻습니까? 그런 다음 설정할 수 있습니다 ControlToValidate 평소와 같이 Visual Studio를 통해이 새로운 컨트롤을 동적으로 동적으로 추가합니다.

다른 팁

비슷한 상황에서 리피터를 사용했습니다.

<table>
<colgroup>
    <col style="white-space: nowrap;" />
    <col />
    <col />
</colgroup>
<asp:Repeater ID="InputFields" runat="server">
    <ItemTemplate>
        <tr>
            <td class="labelCell">
                <asp:Label id="FieldName" runat="server" Font-Bold="True" Text='<%# Eval("Name") %>'></asp:Label>:
            </td>
            <td class="fieldCell">
                <asp:TextBox id="FieldData" runat="server" autocomplete="off" />
            </td>
            <td class="errorCell">
                <asp:RequiredFieldValidator ID="FieldNameRequiredValidator" runat="server" CssClass="errorValidator" ErrorMessage='<%# Eval("Name") %> is required' 
                    ControlToValidate="FieldData" Display="Dynamic">&nbsp;&nbsp;&nbsp;</asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="FieldNameRegexValidator" runat="server" CssClass="errorValidator" ErrorMessage='A valid <%# Eval("Name") %> is required'
                    ControlToValidate="FieldData" Display="Dynamic" ValidationExpression='<%# Eval("RegEx") %>'>&nbsp;&nbsp;&nbsp;</asp:RegularExpressionValidator>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

리피터는 "명명 컨테이너"를 생성하여 FieldData 컨트롤 ID가 컨테이너 내에서 고유한지 확인합니다.

예는 다음과 같습니다.

ID = "패널 홀더"(또는 동적으로 추가 할 수 있음)를 사용하여 설계 시간에 페이지에 패널 컨트롤을 추가하십시오.

그런 다음 컨트롤을 동적으로 만들고 다음과 같은 패널에 추가하십시오.

var myTextbox = new TextBox() {ID="myTextBox"};
PanelHolder.Controls.Add(myTextBox);
var validator = new RequiredFieldValidator() {ControlToValidate="myTextBox",Display=ValidatorDisplay.Dynamic,ErrorMessage="Required field"}
PanelHolder.Controls.Add(validator);

몇 가지 질문 만하면됩니다.

  • 페이지 뒤로 게시하는 컨트롤이 유효성을 유효하게합니까? (그렇다면 별도의 검증 그룹에 있지 않은지 확인하십시오)

  • 검증이 발생하지 않습니까? 유효성 검사기의 errormessage 속성을 설정하지 않으면 아무것도하지 않는다고 생각하기가 쉽습니다. (그리고 나는 당신이 당신의 목록에 그것을 설정하는 것을 볼 수 없습니다)

편집하다:

이렇게하고 있다면 :

        Panel pTest = new Panel();

        TextBox tb = new TextBox();
        for (int i = 0; i < 2; i++)
        {
            tb.ID = "tbDynamicTextBox" + i;
            pTest.Controls.Add(tb );
            RequiredFieldValidator rfv = new RequiredFieldValidator();
            rfv.ControlToValidate = tb.ID;
            rfv.ErrorMessage = "Empty textbox";
            pTest.Controls.Add(rfv);
        }
        cell.Controls.Add(pTest);

그런 다음 텍스트 상자의 하나의 인스턴스 만 Controls Collection에 추가되므로 오류가 발생합니다. 'textbox tb = new TextBox ()를 이동하면; '루프 내부의 일부는 괜찮을 것입니다.

이것이 당신의 문제인지 확실하지 않지만 시도해 볼 가치가 있습니다.

그리드 내부의 Texbox에 대한 Texbox 및 필요한 필드 유효성 검사기를 생성합니다.

TextBox의 ClientID를 필요한 필드 유효성 검사기의 ControlTovalIdate 속성으로 사용하려고 시도했습니다.이 gived는 텍사스 박스의 ID를 필수 필드 유효성 검사기의 컨트롤 테이블 디테이트 속성으로 찾을 수 없었으며 아래 코드 아래 코드를 반환합니다. 방법에 대한 첫 번째 인수.

private RegularExpressionValidator GetRegValidator(string itemId, string regExp)
    {
        RegularExpressionValidator _regVal = new RegularExpressionValidator();
        _regVal.ControlToValidate = itemId;
        _regVal.ValidationExpression = regExp;
        _regVal.ErrorMessage ="PropertyRegexDoesNotMatches";
        _regVal.Text = "*";
        _regVal.SetFocusOnError = true;
        _regVal.EnableClientScript = true;
        _regVal.ID = string.Format("{0}Validator", itemId);
        return _regVal;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top