【问题标题】:The problem when loading a web user control dynamicly动态加载 web 用户控件时的问题
【发布时间】:2011-02-21 00:30:51
【问题描述】:

网页用户控件:FilterLabel

<span style=" display:block; float:left; margin:5px; padding: 5px; border: 1px inset #000000; font-family: Tahoma; font-size: small;">
<asp:Label ID="lblFilterDisplay" runat="server" Text="Product/Service: This is a testing"></asp:Label>
&nbsp;
<asp:ImageButton ID="btnRemove" runat="server" ImageUrl="~/Images/remove.png" OnClick="btnRemove_Click" />

以及该网页用户控件的后台代码部分:

public event EventHandler RemoveClick;
......
public void btnRemove_Click(object sender, EventArgs e)
{
    if (RemoveClick != null)
        RemoveClick(this, EventArgs.Empty);
}

接下来,网络用户控件“FilterLabel”将用于另一个网络用户控件“FilterList”:

<%@ Register TagPrefix="uc" TagName="FilterLabel" Src="~/Controls/FilterLabel.ascx" %>
<asp:Panel ID="FilterList" runat="server" Width="100%" GroupingText="Filter List" CssClass="filterList">
</asp:Panel>

而这个网页用户控件背后的代码部分是:

protected override void OnInit(EventArgs e)
{
    if (IsPostBack)
    {
        BindFilters();
    }

}

public void BindFilters()
{
    List<FilterLabel> filters = Filters;
    foreach (FilterLabel filter in filters)
    {
        FilterList.Controls.Add(filter);
    }
}

public List<FilterLabel> Filters
{
    get
    {
        List<FilterLabel> filters = Session["Filters"] as List<FilterLabel>;
        if (filters == null)
        {
            filters = new List<FilterLabel>();
        }
        return filters;
    }
}

public void AddFilter(string filterName, string filterContent, string filterValue = null)
{
    FilterLabel filter = LoadControl("~/Controls/FilterLabel.ascx") as FilterLabel;
    filter.ID = "Filter";
    filter.FilterContent = filterContent;
    filter.FilterName = filterName;
    filter.Value = filterValue;
    filter.RemoveClick += new EventHandler(RemoveFilter);
    List<FilterLabel> filters = Filters;
    filters.Add(filter);
    Session["Filters"] = filters;
    BindFilters();
}

private void RemoveFilter(object sender, EventArgs e)
{
    //some handling codes
}

所以现在的问题是当我单击图像按钮“btnRemove”时,btnRemove_Click 事件没有被激活。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    您应该尝试使用气泡事件。使用您的解决方案,您需要在每次回发时为现有过滤器的每个用户控件重新绑定事件处理程序

    public int FilterCount 
    {
        get{
            if(ViewState["filter_count"] == 0){
                FilterCount = 0;
            }
            return (int)ViewState["filter_count"];
        }
        set{
            ViewState["filter_count"] = value;
        }
    }
    
    protected void RecreateFilterControlls()
    {
        for(int i =0; i < FilterCount; i++){
            FilterLabel filter = LoadControl("~/Controls/FilterLabel.ascx") as FilterLabel;
            FilterList.Controls.Add(filter);
            filter.RemoveClick += new EventHandler(RemoveFilter);
        }
    }
    
    
    protected override void OnInit(EventArgs e)
    {
        if (IsPostBack)
        {
            RecreateFilterControlls();
        }
    
    }
    // this is for button which will add new FilterLabel UserControl
    protected void AddNewFilter_Click(object sender, EventArgs e)
    {
        // just create filter
        AddFilter(<FilterNameTextBox|combobox>, <FilterContentTextBox>, <filterValue>);
    }
    
    
    public void AddFilter(string filterName, string filterContent, string filterValue = null)
    {
        FilterLabel filter = LoadControl("~/Controls/FilterLabel.ascx") as FilterLabel;
        filter.ID = "Filter";
        filter.FilterContent = filterContent;
        filter.FilterName = filterName;
        filter.Value = filterValue;
        filter.RemoveClick += new EventHandler(RemoveFilter);
        // increament filter count
        FilterCount++;
    
    }
    
    private void RemoveFilter(object sender, EventArgs e)
    {
        //some handling codes
        //remove control which caused this event
        FilterList.Controls.Remove(sender); // or you will need to ask for IndexOf(sender);
        FilterCount--;
    }
    

    其余的将由 ViewState 自己处理,因此您不需要将数据绑定回 FilterLabel 回来

    【讨论】:

    • 这种方式我试过了,但是没用。 btnRemove_Click 事件处理程序未触发。
    • 在您的方法 BindFilters() 添加 foreach 它将遍历每个过滤器控件并将 RemoveFilter 处理程序重新绑定回它
    • 还要在`AddFilter`方法filter.RemoveClick += new EventHandler(RemoveFilter);中删除,因为您稍后将在BindFilters方法中绑定它
    • 是的,我这样做了: public void BindFilters() { List filters = Filters; foreach (FilterLabel filter in filters) { filter.RemoveClick += new EventHandler(RemoveFilter); FilterList.Controls.Add(过滤器); } } 但它没有用。
    • 我已经更新了我的答案,请看一下,但是你应该考虑使用事件冒泡模型,这样会容易很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多