Динамически добавить CalendarExtender в серверный элемент управления подкласса Textbox? - PullRequest
2 голосов
/ 17 сентября 2008

Я пытаюсь создать серверный элемент управления, который наследуется от TextBox, к которому автоматически будет прикреплен CalendarExtender . Возможно ли это сделать, или вместо этого мой новый элемент управления должен наследоваться от CompositeControl? Я пробовал первый вариант, но мне неясно, в какой части жизненного цикла элемента управления мне следует создать новый экземпляр CalendarExtender, и в какую коллекцию элементов управления я должен добавить его. Кажется, я не могу добавить его в коллекцию элементов управления страницы или формы, и если я добавлю его в коллекцию элемента управления (TextBox), я не получу ни одной из функций всплывающего календаря.

Ответы [ 4 ]

2 голосов
/ 17 сентября 2008

Я выполнил это в проекте некоторое время назад. Для этого я создал CompositeControl, который содержит и TextBox, и CalendarExtender.

В методе CreateChildControls CompositeControl я использую код, подобный следующему:

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, имеет менеджер сценариев инструментария.

1 голос
/ 07 ноября 2011

Вы можете легко добавить календарь ajax в пользовательские элементы управления сервером. Вам необходимо добавить две ссылки в ваше приложение. 1. AjaxControlToolkit.dll 2. System.Web.Extensions С помощью второй ссылки мы получим все свойство CalendarExtender в ваших пользовательских серверных элементах управления.

1 голос
/ 12 февраля 2010

Я знаю, что это старая ветка, но я столкнулся с ней, когда у меня был похожий вопрос. Это то, что я реализовал, и это прекрасно работает. Если вы хотите, чтобы элемент управления был TextBox, просто откачайте расширитель во время вызова Render.

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
0 голосов
/ 20 февраля 2012

Когда вы пытаетесь запретить пользователям вводить что-либо в текстовом поле, а только заполнять его расширением календаря, а затем пытаетесь получить выбранную дату из элемента управления текстового поля, это может быть пустая строка, если вы установили текстовое поле свойство ReadOnly = "True".

Это потому, что элементы управления только для чтения НЕ отправляются обратно на сервер. Обходной путь для этого следующий:

защищенный void Page_Load (отправитель объекта, EventArgs e)

{

TextBox1.Attributes.Add ("только для чтения", "только для чтения");

}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...