|
https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
Пользовательские и собственные серверные элементы управления
Атрибуты
Наличие атрибутов — важное свойство языков .NET. С их помощью в метаданные класса в сборку добавляется информация, которая используется самым различным образом. Атрибуты — это классы, наследующие System.Attribute и применяющиеся к пространствам имен, классам, свойствам и методам. Синтаксис применения атрибута в C#:
[CustomAttr(Update:=true, Keep=false)]
Конструктор атрибута указывается в квадратных скобках с параметрами, которые определены в декларации класса атрибута.
В ASP .NET атрибуты в том числе определяют поведение пользовательских элементов управления (а также, например, используются в описании web-сервисов). В описании WebCustomControl1 атрибуты применены и к самому классу, и к свойству Text. Атрибуты класса определяют его помещение в панель Toolbox и в дизайнере страниц. Их можно поделить на 3 категории: атрибуты, помогающие среде разработки работать с элементом управления в режиме дизайна; атрибуты, управляющие выводом дочерних элементов; атрибуты, определяющие его поведение в панели инструментов.
DefaultProperty определяет свойство по умолчанию. При открытии окна свойств элемента управления в дизайнере помеченное этим атрибутом свойство будет выделено бежевым.
ToolboxData задает форматирующую строку. Например,
ToolboxData("<{0}:WebCustomControl1
runat=server></{0}:WebCustomControl1>")Это строка с формальным параметром, в качестве значения которого подставляется атрибут TagPrefix директивы Register, регистрирующей данный элемент на конкретной странице.
Когда в дизайнере страницы происходит двойной щелчок мыши на элементе, среда разработки создает обработчик события, например, SelectedIndexChanged для выпадающего списка DropDownList. Какое именно событие, определяется атрибутом DefaultEvent.
Атрибуты применяются также к свойствам и событиям элемента.
Bindable указывает, что свойство можно связать с источником данных.
Category обозначает категорию в окне свойств элемента. Свойства разбиваются на категории, если выбрать представление Categorized окна свойств.
Атрибут Themable определяет, может ли данное свойство определяться в файле скина.
По умолчанию ASP .NET позволяет всем свойствам написанных нами элементов управления быть описанными в файлах скинов. Это не всегда удобно, если свойство не относится к внешнему виду элемента. В таком случае атрибут создается с параметром false:
[Themeable(false)]
public string TextBrowsable указывает, будет ли отображаться свойство в окне свойств, и EditorBrowsable — возможно ли будет его редактировать.
Существуют и другие атрибуты.
Отрисовка (Rendering) элемента управления
В этом примере построен элемент управления, наследующий от Label. Он раскрашивает текст в случайные цвета. Свойство EnableRainbowMode можно отключить, тогда он станет вести себя как обычная метка:
[ToolboxData("<{0}:RainbowLabel
runat=server></{0}:RainbowLabel>")]
public class RainbowLabel : Label
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("true")]
[Localizable(true)]
public bool EnableRainbowMode
{
get
{
if (ViewState["EnableRainbowMode"] == null)
return true;
else
return
bool.Parse(ViewState["EnableRainbowMode"].ToString());
}
set
{
ViewState["EnableRainbowMode"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
if(EnableRainbowMode)
output.Write(ColorizeString(Text));
else
output.Write(Text);
}
private string ColorizeString(string input)
{
StringBuilder output = new StringBuilder(input.Length);
Random rand = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < input.Length; i++)
{
int color = rand.Next(0xffffff);
string strColor = string.Format(@"<span style=""color:
#{0:x}"">", color);
output.Append(strColor);
output.Append(input.Substring(i, 1));
output.Append("</span>");
}
return output.ToString();
}
}