ASP - 将数据从UserControl发送到另一个

时间:2016-11-03 14:44:53

标签: c# asp.net user-controls updatepanel panel

我正在联系您,因为我不知道如何将数据从UserControl发送到另一个。

背景:

第一个UserControl,UrlControl(uc1)有一个TextBox和一个LinkBut​​ton,允许用户将一个URL添加到一个Event(进入我的数据库)。

另一个UserControl,TileColorControl(uc2)允许用户在他的Event中添加一些颜色。添加的颜色可以附加到所有URL或特定URL。 在此控件中,有一个DropDownList,其中包含事件的不同URL。

我想要的是:当我通过单击“添加”(在uc1中)创建新URL时,DropDownList(在uc2中)会自动刷新自己的更新数据。

This is what I want to do

提前感谢您的帮助

UrlControl(uc1)代码

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillUrls();
        }
    }
    private void FillUrls()
    {
        RepeaterUrl.DataSource = UrlController.FindByEvent(EventId);
        RepeaterUrl.DataBind();
    }
    protected void LinkButtonSaveNew_Click(object sender, EventArgs e)
    {
        string txtUrl = TextBoxNewUrl.Text;
        if (UrlController.IsValidUrl(txtUrl))
        {
            DMCAccess.Event evt = EventController.FindByUrl(txtUrl);
            if (evt != null)
            {
                btnMsgFailed.Visible = false;lbInfo.Visible = false;
                showMsgAlreadyUsed(evt);
            }
            if (!UrlController.IsAlreadyExist(txtUrl))
            {
                Guid userGuid =                      PersonsController.GetPersonByUserGuid((Guid)Membership.GetUser().ProviderUserKey).Guid;
                Url url = new Url
                {
                    Guid = Guid.NewGuid(),
                    UrlLink = TextBoxNewUrl.Text,
                    IsDeleted = false,
                    EventGuid = EventId,
                    CreationByGuid = userGuid,
                    ModificationByGuid = userGuid,
                    CreationDate = DateTime.Now,
                    ModificationDate = DateTime.Now
                };
                UrlController.Create(url);
                msgSuccess("http://" + url.UrlLink + " was created");
                FillUrls();
            }
        }
        else
        {
            HyperLinkViewEvent.Visible = false;
            msgFailed("Please, enter a valid URL.");
        }
    }

TileColorControl(uc2)代码

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillColors();
            FillUrls();
        }
    }

    protected void RepeaterColor_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DropDownList ddlUrls = (DropDownList)e.Item.FindControl("ddlUrls");
            ddlUrls.DataSource = urls();
            ddlUrls.DataTextField = "Value";
            ddlUrls.DataValueField = "Key";
            ddlUrls.DataBind();
            ddlUrls.Items.Insert(0, new ListItem("Default", Guid.Empty.ToString()));

            Guid? urlGuid = ((DMCAccess.TileColor)e.Item.DataItem).UrlGuid;
            if (urlGuid.HasValue)
            {
                ddlUrls.SelectedIndex = ddlUrls.Items.IndexOf(ddlUrls.Items.FindByValue(urlGuid.Value.ToString()));
            }
        }
    }

    public void FillUrls()
    {
        DropDownListBoxUrl.DataSource = urls();
        DropDownListBoxUrl.DataTextField = "Value";
        DropDownListBoxUrl.DataValueField = "Key";
        DropDownListBoxUrl.DataBind();
        DropDownListBoxUrl.Items.Insert(0, new ListItem("Default", Guid.Empty.ToString()));
    }

    private Dictionary<Guid, string> urls()
    {
        Dictionary<Guid, string> dUrls = new Dictionary<Guid, string>();
        foreach (Url u in UrlController.FindByEvent(EventId))
        {
            dUrls.Add(u.Guid, u.UrlLink);
        }
        return dUrls;
    }

    private void FillColors()
    {
        TextBoxNewIdColor.Text = TileColorController.MaxColorIdByEvent(EventId).ToString();
        if (UrlController.FindByEvent(EventId).Count < 1)
        {
            upNoWebsite.Visible = true;
            upColor.Visible = false;
        }
        RepeaterColor.DataSource = TileColorController.FindByEvent(EventId);
        RepeaterColor.DataBind();
    }

3 个答案:

答案 0 :(得分:0)

您可以使用事件冒泡在控件层次结构的父级别连接这两个控件。

我认为你的控件都包含在另一个父控件或页面中,如下所示:

<control:UrlControl runat="server" id="uc1" />
<control:TileColorControl runat="server" id="uc2" />

首先,您必须在uc1中声明一个事件 - 例如&#34; OnNewUrl&#34;:

public event EventHandler OnNewUrl;

然后将此事件绑定到&#34; master&#34;中具有所需功能的方法。页:

protected void Page_Load(object sender, EventArgs e)
{
    uc1.OnNewUrl += RebindTileColorControl;
}

protected void RebindTileColorControl(object sender, EventArgs e)
{
  // rebind uc2 here ...
}

有关事件冒泡的更多信息,您可以在MSDN herehere中找到。

答案 1 :(得分:0)

对我来说,似乎UrlControl应该知道那里的TileColorControl并且应该告诉它更新。

将具有TileColorControl类型的公共变量/属性添加到UrlControl类

public TileColorControl AssociatedTileColor { get; set; }

在父控件/页面上,您将对uc2(TileColorControl)的引用分配给uc1的变量/属性

uc1.AssociatedTileColor = uc2;

在UrlControl中,您可以使用AssociatedTileColor来调用uc1的FillUrls方法

if (uc1.AssociatedTileColor != null)
{
    uc1.AssociatedTileColor.FillUrls();
}

答案 2 :(得分:0)

我终于找到了如何做到这一点:

TileColorControl:没什么可改变的 Event.aspx(包含用户控件的页面),添加公共方法:

public void FillUrls()
{
  TileColorControl.FillUrls();
}

UrlControl:在功能添加或更新添加行:

DMC.Event currentEvent = (DMC.Event)Page;
currentEvent.FillUrls();

已经完成,它会更新我的DropDownList!