TextBox에서 상속 한 서버 컨트롤을 만들려고하는데, 자동으로 CalendarExtender이 첨부됩니다. 이 작업을 수행 할 수 있습니까, 아니면 내 새 컨트롤 대신 CompositeControl에서 상속해야합니까? 나는 전 (前者)을 시도했지만, 컨트롤 수명주기의 어느 부분에서 CalendarExtender의 새 인스턴스를 만들어야하는지 명확하지 않으며, 컬렉션을 추가해야하는 컨트롤을 제어합니다. 페이지 또는 양식의 컨트롤 컬렉션에 추가 할 수있는 것 같지 않습니다. 그리고이를 (TextBox) 컨트롤의 컬렉션에 추가하면 팝업 일정 기능이 없습니다.TextBox 하위 클래스 서버 컨트롤에 CalendarExtender를 동적으로 추가 하시겠습니까?
답변
프로젝트에서이 작업을 수행했습니다. 이를 위해 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를 포함하는 폼이 툴킷 스크립트 관리자를 가지고 있는지 확인하십시오.
나는 이것이 낡은 스레드라는 것을 알고 있지만 비슷한 질문을했을 때 우연히 만났습니다. 이것이 내가 구현을 끝낸 것이며, 그것은 훌륭하게 작동합니다. 컨트롤을 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
사용자 정의 서버 컨트롤에 쉽게 ajax 캘린더를 추가 할 수 있습니다. 애플리케이션에 두 개의 참조를 추가해야합니다. 1. AjaxControlToolkit.dll 2. System.Web.Extensions 두 번째 참조를 사용하여 사용자 지정 서버 컨트롤에서 "CalendarExtender"의 모든 속성을 가져옵니다.
사용자가 텍스트 상자에 내용을 입력 할 수는 있지만 달력 확장명으로 만 채우고 텍스트 상자 컨트롤에서 선택한 날짜를 가져 오지 못하게하려는 경우 빈 문자열이 될 수 있습니다. textbox 속성을 ReadOnly = "True"로 설정합니다.
왜냐하면 읽기 전용 컨트롤이 서버에 다시 게시되지 않기 때문입니다. 이를위한 해결 방법은 다음
보호 보이드를 Page_Load (객체 송신자있는 EventArgs E)
{
TextBox1.Attributes.Add ("읽기 전용", "읽기 전용");
}
희망이 있습니다.
그렇다면 적절한 하위 컨트롤에 속성을 구현하고 전달해야한다고 가정하는 것이 안전할까요? 예를 들어, TextBox의 Text 속성을 원하면 CompositeControl에 구현하고 Child TextBox로 전달합니다. – LockeCJ
기본적으로 예입니다. 그러나 내부 TextBox를 내 코드가 처리하는 것과 달리 CompositeControl의 인스턴스 멤버 (CreateChildControls 이전에 인스턴스화해야 할 수도 있음)로 지정해야합니다. –