2

TextBox에서 상속 한 서버 컨트롤을 만들려고하는데, 자동으로 CalendarExtender이 첨부됩니다. 이 작업을 수행 할 수 있습니까, 아니면 내 새 컨트롤 대신 CompositeControl에서 상속해야합니까? 나는 전 (前者)을 시도했지만, 컨트롤 수명주기의 어느 부분에서 CalendarExtender의 새 인스턴스를 만들어야하는지 명확하지 않으며, 컬렉션을 추가해야하는 컨트롤을 제어합니다. 페이지 또는 양식의 컨트롤 컬렉션에 추가 할 수있는 것 같지 않습니다. 그리고이를 (TextBox) 컨트롤의 컬렉션에 추가하면 팝업 일정 기능이 없습니다.TextBox 하위 클래스 서버 컨트롤에 CalendarExtender를 동적으로 추가 하시겠습니까?

답변

2

프로젝트에서이 작업을 수행했습니다. 이를 위해 TextBox와 CalendarExtender를 모두 포함하는 CompositeControl을 만들었습니다. CompositeControl의 CreateChildControls 방법에서

나는이 유사한 코드를 사용

TextBox textbox = new TextBox(); 
textbox.ID = this.ID + "Textbox"; 
textbox.Text = this.EditableField.TextValue; 
textbox.TextChanged += new EventHandler(HandleTextboxTextChanged); 
textbox.Width = new Unit(100, UnitType.Pixel); 
CalendarExtender calExender = new CalendarExtender(); 
calExender.PopupButtonID = "Image1"; 
calExender.TargetControlID = textbox.ID; 
this.Controls.Add(textbox); 
this.Controls.Add(calExender); 

물론이 CompositeControl를 포함하는 폼이 툴킷 스크립트 관리자를 가지고 있는지 확인하십시오.

+0

그렇다면 적절한 하위 컨트롤에 속성을 구현하고 전달해야한다고 가정하는 것이 안전할까요? 예를 들어, TextBox의 Text 속성을 원하면 CompositeControl에 구현하고 Child TextBox로 전달합니다. – LockeCJ

+0

기본적으로 예입니다. 그러나 내부 TextBox를 내 코드가 처리하는 것과 달리 CompositeControl의 인스턴스 멤버 (CreateChildControls 이전에 인스턴스화해야 할 수도 있음)로 지정해야합니다. –

1

나는 이것이 낡은 스레드라는 것을 알고 있지만 비슷한 질문을했을 때 우연히 만났습니다. 이것이 내가 구현을 끝낸 것이며, 그것은 훌륭하게 작동합니다. 컨트롤을 TextBox로 만들려면 Render 호출 중에 Extender를 펌핑하면됩니다.

Imports System.Web.UI.WebControls 
Imports AjaxControlToolkit 

Public Class DateTextBox 
    Inherits TextBox 

    Private _dateValidator As CompareValidator 
    Private _calendarExtender As CalendarExtender 

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 
     MyBase.OnInit(e) 

     _dateValidator = New CompareValidator 
     With _dateValidator 
      .ControlToValidate = ID 
      Rem set your other properties 
     End With 
     Controls.Add(_dateValidator) 

     _calendarExtender = New CalendarExtender 
     With _calendarExtender 
      .TargetControlID = ID 
     End With 
     Controls.Add(_calendarExtender) 
    End Sub 

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
     MyBase.Render(writer) 
     _dateValidator.RenderControl(writer) 
     _calendarExtender.RenderControl(writer) 
    End Sub 
End Class 
1

사용자 정의 서버 컨트롤에 쉽게 ajax 캘린더를 추가 할 수 있습니다. 애플리케이션에 두 개의 참조를 추가해야합니다. 1. AjaxControlToolkit.dll 2. System.Web.Extensions 두 번째 참조를 사용하여 사용자 지정 서버 컨트롤에서 "CalendarExtender"의 모든 속성을 가져옵니다.

0

사용자가 텍스트 상자에 내용을 입력 할 수는 있지만 달력 확장명으로 만 채우고 텍스트 상자 컨트롤에서 선택한 날짜를 가져 오지 못하게하려는 경우 빈 문자열이 될 수 있습니다. textbox 속성을 ReadOnly = "True"로 설정합니다.

왜냐하면 읽기 전용 컨트롤이 서버에 다시 게시되지 않기 때문입니다. 이를위한 해결 방법은 다음

보호 보이드를 Page_Load (객체 송신자있는 EventArgs E)

{

TextBox1.Attributes.Add ("읽기 전용", "읽기 전용");

}

희망이 있습니다.