繁体   English   中英

从UserControl传递值到ParentPage控件无法正常工作

[英]Passing Value from UserControl to ParentPage control not working properly

我创建了一个相册用户控件,该控件在一个精美的框中显示摄影师。

我还在多个页面上使用此控件来显示与页面相关的照片。 在隐藏照相馆用户控制中,如果他们没有特定页面的照片。 为此,我通过了公共活动

 public event SendMessageToThePageHandler showGallery;

传递布尔值以在页面上隐藏和显示usercontrol。

页面运行无任何错误并显示图库。 但是寻呼机的问题出在我编码的方式上不起作用。 当我单击第2页或图库时,它将生成NullReferenceException

对于这种情况,我可以采用一种更专业的方法,在这种情况下,我可以将passvalue正确传递给父页面以正确隐藏/显示。

我也在用户控件中使用UpdatePanel。 以下是“父页面和用户控制”页面中的示例代码

在此处输入图片说明

PageOne.aspx

 <uc1:PhotoGallery ID="ucPhotoGallery" runat="server" />

后面的代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        try
        {
            int _LangID = int.Parse(Helper.GetAppSettingValue("EnglishLanguageID"));
            if (string.IsNullOrEmpty(Request["PID"]))
            {

                _LID = int.Parse(HttpContext.Current.Request.RequestContext.RouteData.Values["LID"].ToString());
                _PID = int.Parse(HttpContext.Current.Request.RequestContext.RouteData.Values["PID"].ToString());
                getPageDetails(_PID);
                getPageSubMenus(_PID);
              //  WriteThisMessageToThePage1.sendMessageToThePage += delegate(string message)
                ucPhotoGallery.showGallery += delegate(bool showControl)
                {
                    bool bShowControl = showControl;
                    ucPhotoGallery.Visible = bShowControl;
                };
            }
            else
            {
                Response.Write("Page not be found, Wrong URL");
            }

        }
        catch (Exception ex)
        {
        }
    }

}

图片库

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Photo-Gallery.ascx.cs" Inherits="Photo_Gallery" %>
<%@ Register Src="~/en/UserControls/PagerControl.ascx" TagName="PagerControl" TagPrefix="uc1" %>
<div class="uc-gallery-wrapper">
<div class="page-title-side-wrapper"><h5><asp:Label ID="lblPageTitleSide" CssClass="lbl-page-title-side" runat="server" Text=" Gallery"></asp:Label></h5></div>
<asp:UpdatePanel ID="updPnlAlbums"  runat="server" UpdateMode="Conditional">
   <ContentTemplate>
   <div class="rptAlbums-wrapper">
        <asp:Repeater ID="rptAlbums" runat="server" >
            <ItemTemplate>
                <div class="uc-album-wrapper">
                    <div class="uc-album-icon"><asp:Image ID="imgAlbumIcon" CssClass="uc-album-img" ImageUrl='<%# getImage(Eval("AlbumIcon")) %>' AlternateText='<%# getTitle(Eval("AlbumName")) %>'  runat="server" /></div>
                    <div class="uc-album-name">
                        <asp:HyperLink ID="hylnkAlbum" CssClass="fancybox-iframe"  runat="server" NavigateUrl='<%# getAID(Eval("AlbumID")) %>'>
                        <asp:Label ID="lblAlbumName"  runat="server" Text='<%# getTitle(Eval("AlbumName")) %>'></asp:Label>

                        </asp:HyperLink>
                    </div>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </div>
    <div class="uc-gallery-pager-wrapper-o">
        <div class="uc-pager-wrapper-i">
        <uc1:PagerControl ID="PagerControl1" runat="server"  CssClass="gold-pager"  PageMode="LinkButton"  />
        <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="updPnlAlbums" Visible="False">
            <ProgressTemplate>
                <div id="imgLoadingNewsList" class="uc-PagerLoading">
                    <asp:Image ID="imgLoading" runat="server" ImageUrl="~/Images/preloader-160x15.gif" Visible="false" AlternateText="loading"  />
                </div>
            </ProgressTemplate>
        </asp:UpdateProgress>
        </div>
       </div>
    </ContentTemplate>
</asp:UpdatePanel>
<!-- UpdatePanel -->

</div>

后面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.Globalization;
using System.Data;
using CMS.SqlHelper;
using CMS.DataAccessLayer;
using System.Text;

public delegate void SendMessageToThePageHandler(bool showGallery);

public partial class Photo_Gallery : System.Web.UI.UserControl
{
    int _PageID = 0;

    public event SendMessageToThePageHandler showGallery;

    protected void Page_Load(object sender, EventArgs e)
    {
        PagerControl1.PagerControl_PageIndexChanged += new EventHandler(PagerControl1_PagerControl_PageIndexChanged);
        Page.MaintainScrollPositionOnPostBack = false;

        if (!IsPostBack)
        {
            if (string.IsNullOrEmpty(Request["PID"]))
            {

                _PageID = int.Parse(HttpContext.Current.Request.RequestContext.RouteData.Values["PID"].ToString());
                //_PageID = 3;

                getAlbumByPageID(3);

            }
            else
            {
                Response.Write("Page not be found, Wrong URL");
            }
        }
    }

    public void getAlbumByPageID(int _PageID)
    {
        PagerControl1.PageSize = 2;
        PagerControl1.DisplayEntriesCount = 5;
        //Will show 2 links after ...
        PagerControl1.EdgeEntriesCount = 0;
        DataSet ds = DataProvider.GetAlbumByPageID(_PageID);
        DataView dv = ds.Tables[0].DefaultView;

        if (ds.Tables[0].Rows.Count > 0)
        {
            showGallery(true);
        }
        else
        {
            showGallery(false);
        }

        //pass the datatable and control to bind
        PagerControl1.BindDataWithPaging(rptAlbums, dv.Table);
    }

    void PagerControl1_PagerControl_PageIndexChanged(object sender, EventArgs e)
    {
        _PageID = int.Parse(HttpContext.Current.Request.RequestContext.RouteData.Values["PID"].ToString());
        getAlbumByPageID(_PageID);
    }

}

周围的工作

通过将用户控件包装在面板中并隐藏/显示面板(如果我没有该页面的照片),我找到了解决方法。 这工作正常,但我仍然想解决我遇到的问题,甚至是解决问题的更好方法。

<asp:Panel ID="pnl_uc_Gallery" runat="server" Visible="false">
// I have PUT all the USER CONTROL CODE In SIDE THIS BLOAK
 </asp:Panel>  


if (ds.Tables[0].Rows.Count > 0)
{
   // showGallery(true);
    pnl_uc_Gallery.Visible = true;
}
else
{
    //showGallery(false);
    pnl_uc_Gallery.Visible = false;
}

这段代码:

 ucPhotoGallery.showGallery += delegate(bool showControl)
                {
                    bool bShowControl = showControl;
                    ucPhotoGallery.Visible = bShowControl;
                };

!Page.IsPostback调用中; 将其移到外部,以便您可以在每个回发(不仅是第一个回发)上附加到事件,或者将方法用作事件处理程序并在标记中设置方法名称。 无论哪种方式,问题都是仅在第一个页面加载上建立事件处理程序,而不在后续加载上建立事件处理程序,并且每次请求到达服务器时都需要完成该事件处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM