Динамически добавлять CalendarExtender в серверный элемент управления подкласса Textbox?

StackOverflow https://stackoverflow.com/questions/83770

Вопрос

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

Это было полезно?

Решение

Я достиг этого в проекте некоторое время назад.Для этого я создал 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, имеет менеджер сценариев набора инструментов.

Другие советы

Я знаю, что это старая тема, но я наткнулся на нее, когда у меня возник аналогичный вопрос.Это то, что я в конечном итоге реализовал, и это отлично работает.Если вы хотите, чтобы элемент управления БЫЛ 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

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

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

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

protected void Page_Load (отправитель объекта, EventArgs e)

{

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

}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top