加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 如何根据属性值更新设计时UserControl接口?

发布时间:2020-12-16 07:08:18 所属栏目:asp.Net 来源:网络整理
导读:我创建了一个具有以下公共属性的UserControl: [Browsable(true)]public string Text{ get { return pnlLookupTable.GroupingText; } set { pnlLookupTable.GroupingText = value; }} 正如您可能已经猜到的那样,pnlLookupTable是一个Panel控件.我可以在“属
我创建了一个具有以下公共属性的UserControl:

[Browsable(true)]
public string Text
{
    get { return pnlLookupTable.GroupingText; }
    set { pnlLookupTable.GroupingText = value; }
}

正如您可能已经猜到的那样,pnlLookupTable是一个Panel控件.我可以在“属性”窗口中更改Text属性的值,它会像标记一样反映在标记中.但是,页面内UserControl的设计视图不会显示Panel的更新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>

我已经更改了一些标识符和其他琐碎的东西来保护代码的专有性质.

我还应该重申,我正在设计模式中查看添加了控件的Web表单,并且我正在更改Text属性.我想在设计器中直观地看到Panel的GroupingText的变化.

解决方法

我必须回顾一下UserControlDesigner代码……

简短的故事:我不认为这是可能的.

这是长篇故事:

据我所知,ASCX文件中的用户控件永远不会在设计器中运行.也就是说,ASCX或ASCX.CS文件中的代码永远不会在Visual Studio中编译或运行.这是为了防止由于在CLR中无法卸载已加载的程序集而导致的内存泄漏.为了在用户控件中运行代码,Visual Studio必须将ASCX编译为DLL,然后加载它,然后运行代码.每次更改ASCX时,都必须再次执行此操作.每次执行此操作时,ASCX生成的额外加载的DLL将占用更多内存.

由于CLR中的这种限制,用户控件设计器实际上并不编译或运行ASCX文件.相反,它解析ASCX文件并在其中查找控件,而是加载这些控件.对于它在ASCX文件中找到的每个控件,它将创建关联的控件设计器并呈现该控件的设计时HTML.

有几种方法可以解决这个问题:

>您可以编写从Control派生的常规自定义控件,而不是使用ASCX用户控件,代码是用CS或VB文件编写的.
>将ASCX编译为DLL. David Ebbo写了一篇关于如何做到这一点的blog post.

这两个解决方案应该工作的原因是它们都涉及将代码编译成DLL.这个想法是DLL不会经常更改,因此Visual Studio加载DLL是安全的,而不必在每次DLL更改(和泄漏内存)时重新加载它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读