Я создал UserControl со следующей общественной собственностью:
[Browsable(true)]
public string Text
{
get { return pnlLookupTable.GroupingText; }
set { pnlLookupTable.GroupingText = value; }
}
pnlLookupTable, как Вы, возможно, предположили, управление Панелью. Я могу изменить значение текстового свойства в Окне свойств, и оно отражается в разметке как он, должен быть. Однако режим конструктора UserControl в странице не показывает, обновил GroupingText для Панели. Как я могу заставить это происходить?
Править:
Запросом вот весь класс, которому принадлежит то свойство. Вы видите, что нет ничего специального продолжения:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class LookupTable : System.Web.UI.UserControl
{
[Browsable(true)]
public string Text
{
get { return pnlLookupTable.GroupingText; }
set { pnlLookupTable.GroupingText = value; }
}
}
И вот соответствующая часть .ascx файла:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="LookupTable.ascx.cs" Inherits="LookupTable" %>
<asp:Panel ID="pnlLookupTable" runat="server" GroupingText="Lookup Table">
<%-- Irrelevant content here. --%>
</asp:Panel>
Я изменил некоторые идентификаторы и другие тривиальные вещи защитить собственную природу кода.
Я должен также повторить, что смотрю на Веб-форму в режиме проектирования, который имеет мой контроль, добавленный, и я изменяю текстовое свойство. Я хочу видеть изменение в GroupingText Панели визуально в разработчике.
Мне пришлось немного подумать с кодом Usercontroldesigner ...
Короткие истории: я не думаю, что это возможно.
И вот длинная история:
Из того, что я помню, пользовательские элементы управления, расположенные в файлах ASCX, никогда не работают в дизайнере. То есть код внутри файла ASCX или ASCX.CS никогда не скомпилирован или работает в Visual Studio. Это для предотвращения утечек памяти, вызванные тем, что в CLR вы не можете разгружать сборки, которые вы загрузили. Чтобы запустить код в вашем управлении пользователя, Visual Studio придется компилировать свой ASCX в DLL, затем загрузите ее, а затем запустите код. Каждый раз, когда вы делаете изменение в ASCX, ему придется снова выполнить эту операцию. Каждый раз, когда эта операция происходит больше памяти, будет потребляться дополнительно загруженной DLL, генерированной из вашего ASCX.
Из-за этого ограничения в CLR Control Designer контроля пользователя на самом деле не скомпилируется или не выполняет файл ASCX. Вместо этого он анализирует файл ASCX и ищет элементы управления внутри него, и вместо этого загружается эти элементы управления. Для каждого элемента управления он находит в файле ASCX, он создаст ассоциированный конструктор управления и представляют This Design Time HTML.
Существует пара способов работы:
Причина, по которой эти два решения должны работать, состоит в том, что они оба включают в себя, что код скомпилирован в DLL. Идея состоит в том, что DLL не изменится очень часто, так что безопасно для Visual Studio загружать DLL без риска, чтобы перезагрузить его каждый раз, когда DLL изменится (и память утечки).
Я наверняка, у меня был ответ на это, и написал все это, но что-то беспокоило меня, поэтому я оказался тестированием это на несколько часов.
Оказывается, что (так же, как Эйлон сказал), я не думаю, что вы можете сделать это.
Управления ASCX полностью игнорируют designerAttribute , поэтому вы не можете указать настраиваемое изменение дизайна для них рендеринга. Я думал: «Хорошо, я могу подклассьте панель управления и указать новый дизайнер на нем, что получит свойства от родительского управления». Угадай, что? Без шансов. Если вы получите доступ к родительскому управлению панели в дизайнере, он не будет брошен на пользовательский тип USERCONTROL . Я вижу, что это USERCONTROL, и он не может быть любым другим USERCONTROL, кроме моего TestuserControl, но класс Designer бросает исключение, если я стараюсь бросить его!
Это дует мой разум, если честно. В основном это именно то, что говорит Эйлон - есть намеренное ограничение на веб-сервере в режиме дизайна.
Пока это была для меня возможностью изучения для изучения, мне извините, что сообщаю, что я не думаю, что .ascx отрезал его. Я уверен, что даже составлением его, как Эйлон предложил даже не делать этого. Вы, вероятно, придется пойти на заказ на заказ по маршруту.