Как связать вложенный элемент управления с кодом главной страницы - PullRequest
0 голосов
/ 10 сентября 2009

У меня есть следующая структура, и мне нужно перепривязать нижний элемент управления (DropDownList) из кода позади главной страницы.

    x MainPage1 x---- Panel1 (modal popup)
    x--------- UpdatePanel (upMailOrStatusAction, on Panel1)
    x-------------- RadioButtonList (rblActionLevel, on UpdatePanel)
    x-------------- SubForm1 (on Panel1)
    x------------------- CustomControl1 (on Subform1)
    x------------------------ DropDownList (on CustomControl1)

Каков будет правильный способ сделать это?

Я добавил публичный метод "BindMailActionLookup ()" в элемент управления, но как я могу вызвать его с главной страницы? Я получаю "не существует в текущем контексте"?

Вот разметка подчиненной формы:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MailAddSubform.ascx.cs" 
Inherits="Company.Solutions.Web.Controls.MailAddSubform" %>

<%@ Register TagPrefix="st" TagName="MailActionLookup" Src="~/Controls/StMailActionLookup.ascx" %>
<div class="NinetyNinePercentWide">
    <div class="NinetyNinePercentWide EightPixelBottomMargin">
        <div class="RowHeader" style="padding-top: 20px;">
            <span class="labelfield" >Action:</span>
        </div>
        <div>
            <st:MailActionLookup ID="mailActionLookup" runat="server" />
        </div>
    </div>
    <div class="NinetyNinePercentWide EightPixelBottomMargin" >
        <br class="NinetyNinePercentWide" Text="&nbsp" />
        <div class="RowHeader" >
            <span class="labelfield" >Message:</span>    
        </div>
        <div class="TwelvePixelLeftPad" >
            <asp:TextBox ID="txtMailActionMessage" runat="server" MaxLength="40" />
        </div>
    </div>
</div>

Вот разметка для пользовательского элемента управления:

<%@ Control Language="C#" AutoEventWireup="true"        CodeBehind="StMailActionLookup.ascx.cs"     Inherits="Company.Solutions.Web.Controls.StMailActionLookup" %>


<div id="mainControlContainer" style="width:99%; padding:8px;">

<div id="comboContainer" style="float:left; padding-top:12px;padding-left:5px; padding- right:5px; padding-bottom:3px;">
  <asp:UpdatePanel runat="server" ID="mailActionUpdater">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="chkForms" EventName="CheckedChanged" />
        <asp:AsyncPostBackTrigger ControlID="chkRequested" EventName="CheckedChanged" />
        <asp:AsyncPostBackTrigger ControlID="chkOther" EventName="CheckedChanged" />
    </Triggers>
    <ContentTemplate>
        <asp:DropDownList runat="server" ID="ddlLookup" width="240px" ondatabound="ddlLookup_DataBound1" /> 
    </ContentTemplate>
  </asp:UpdatePanel>


</div>

<div id="filterContainer" style="text-align:left;padding-left:6px;width:275px">
    <fieldset style="width:260px;">
        <legend>Filters</legend>
        <asp:CheckBox ID="chkForms" runat="server" Text="Forms" AutoPostBack="true" />
        <asp:CheckBox ID="chkRequested" runat="server" Text="Requested Info" AutoPostBack="true" />
        <asp:CheckBox ID="chkOther" runat="server" Text="Other" AutoPostBack="true" />
    </fieldset>

</div>    
</div>

А вот часть кода, где я добавил публичный метод:

namespace Company.Solutions.Web.Controls
{
    public partial class StMailActionLookup : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           BindForm();
        }

        public void BindMailActionLookup()
        {
            BindForm();
        }

        protected void BindForm()
        {
            GetActionLevel();
            IEnumerable actions = GetClaimMailActions(GetFilter());
            ddlLookup.DataSource = actions;
            ddlLookup.DataTextField = "CodeAndDescription";
            ddlLookup.DataValueField = "ActionCd";
            ddlLookup.DataBind();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 10 сентября 2009

Вы не должны раскрывать внутреннее содержимое CustomControl1 для потребителя, поэтому наиболее правильным способом было бы предоставить публичный метод (возможно, назовите его «ResetDropDowns») на вашем CustomControl1, в который может обращаться главная страница.

CustomControl1 знает о своих собственных выпадающих списках, поэтому он может легко находить и перепривязывать элемент управления, когда кто-то вызывает метод.

0 голосов
/ 11 сентября 2009

Хорошо, у нас есть решение благодаря предложениям "womp" и одному из моих сотрудников. Просто продолжайте вкладывать публичные звонки в цепочку:

Это в основном коде информации о претензиях:

    // Rebind the action code drop down to restrict to base level 
    mailAddSubform.BindMailActionLookup();

Тогда это в коде подчиненной формы:

    public void BindMailActionLookup()
    {
        mailActionLookup.BindMailActionLookup();
    }

И, наконец, это в элементе управления поиском:

  public void BindMailActionLookup()
    {
        BindForm();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...