Как обновить интерфейс UserControl времени проектирования на основе значения свойства?

Я создал 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 Панели визуально в разработчике.

5
задан Andy West 16 January 2010 в 21:52
поделиться

2 ответа

- 3959464-

Мне пришлось немного подумать с кодом 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.

Существует пара способов работы:

  1. вместо использования элемента управления пользователя ASCX, вы можете написать обычный пользовательский элемент управления, который вытекает из элемента управления, и код записан в файл CS или VB.
  2. Составьте ASCX в DLL. Дэвид-Эббо написал сообщение в блоге о том, как это сделать.

Причина, по которой эти два решения должны работать, состоит в том, что они оба включают в себя, что код скомпилирован в DLL. Идея состоит в том, что DLL не изменится очень часто, так что безопасно для Visual Studio загружать DLL без риска, чтобы перезагрузить его каждый раз, когда DLL изменится (и память утечки).

6
ответ дан 14 December 2019 в 08:51
поделиться

Я наверняка, у меня был ответ на это, и написал все это, но что-то беспокоило меня, поэтому я оказался тестированием это на несколько часов.

Оказывается, что (так же, как Эйлон сказал), я не думаю, что вы можете сделать это.

Управления ASCX полностью игнорируют designerAttribute , поэтому вы не можете указать настраиваемое изменение дизайна для них рендеринга. Я думал: «Хорошо, я могу подклассьте панель управления и указать новый дизайнер на нем, что получит свойства от родительского управления». Угадай, что? Без шансов. Если вы получите доступ к родительскому управлению панели в дизайнере, он не будет брошен на пользовательский тип USERCONTROL . Я вижу, что это USERCONTROL, и он не может быть любым другим USERCONTROL, кроме моего TestuserControl, но класс Designer бросает исключение, если я стараюсь бросить его!

Это дует мой разум, если честно. В основном это именно то, что говорит Эйлон - есть намеренное ограничение на веб-сервере в режиме дизайна.

Вот расплывчатый пост от Стивена Чэна, предполагающий, что поддержка проектирования - это просто недоедание для веб-интерферкторов.

Пока это была для меня возможностью изучения для изучения, мне извините, что сообщаю, что я не думаю, что .ascx отрезал его. Я уверен, что даже составлением его, как Эйлон предложил даже не делать этого. Вы, вероятно, придется пойти на заказ на заказ по маршруту.

1
ответ дан 14 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: