2016-11-03 7 views
0

私はUserControlから別のものにデータを送信する方法がわからないため、私はあなたに連絡しています。ASP - UserControlから別のものにデータを送信

コンテキスト:

最初のユーザーコントロール、UrlControl(UC1)ユーザーがイベントにURLを追加できるテキストボックスとのLinkBut​​ton持っ

他のユーザーコントロール、TileColorControl(私のデータベースにします。) (uc2)を使用すると、ユーザーはイベントに色を追加できます。追加された色は、すべてのURLまたは特定のURLに付けることができます。 このコントロールには、イベントの異なるURLを含むDropDownListがあります。

私がしたいこと:「追加」(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(); 
    } 

答えて

0

イベントバブリングを使用して、これら2つのコントロールをコントロール階層の親レベルで接続できます。

私はこのように、あなたのコントロールが両方とも別の親コントロールまたはページに含まれているとします

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

まずあなたがUC1でイベントを宣言する必要があります - 例えば「OnNewUrl」:

public event EventHandler OnNewUrl; 

はその後、「マスター」ページで目的の機能をメソッドにこのイベントをバインドする:あなたはMSDN herehereに見つけることができるイベントバブルに関する

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

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

詳細情報。

0

私には、UrlControlはそこにあるTileColorControlについて知っている必要があり、更新するように指示する必要があります。

あなたはUC1の変数にUC2(TileColorControl)への参照を割り当てる親コントロール/ページでUrlControlクラス

public TileColorControl AssociatedTileColor { get; set; } 

/プロパティに型TileColorControlとパブリック変数/プロパティを追加します

uc1.AssociatedTileColor = uc2; 

UrlControlでは、UC1のFillUrlsメソッドを呼び出すためにAssociatedTileColorを使用することができます

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

私は最終的にそれを行う方法が見つかりました:

TileColorControl: Event.aspx(ユーザーコントロールを含むページ)を変更するには何も、パブリックメソッドを追加します。

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

UrlControl:機能の追加や更新で行を追加:

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

これで、DropDownListが更新されました。

関連する問題