2010-08-05 86 views
1

我有一個更新面板內的下拉列表內容頁:下拉列表

   <asp:UpdatePanel ID="upVehicleFilter" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
       <ContentTemplate> 

        <asp:DropDownList id="ddlYear" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlYear_SelectedIndexChanged"></asp:DropDownList> 
        <asp:DropDownList id="ddlMake" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlMake_SelectedIndexChanged"></asp:DropDownList> 
        <asp:DropDownList id="ddlModel" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlModel_SelectedIndexChanged"></asp:DropDownList> 
        <asp:DropDownList id="ddlEngine" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlEngine_SelectedIndexChanged"></asp:DropDownList> 
        <asp:DropDownList id="ddlAspiration" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlAspiration_SelectedIndexChanged"></asp:DropDownList> 
        <asp:DropDownList id="ddlEngVin" runat="server"></asp:DropDownList> 
        <asp:ImageButton id="btnGo" runat="server" ImageUrl="/images/buttons/btn_go.gif" OnClick="btnVehicleGo_Click"></asp:ImageButton> 

       </ContentTemplate> 
      </asp:UpdatePanel> 

邏輯(事件)也存在於內容頁面:

protected void ddlYear_SelectedIndexChanged(object sender, EventArgs e)... 
protected void ddlMake_SelectedIndexChanged(object sender, EventArgs e)... 
protected void ddlModel_SelectedIndexChanged(object sender, EventArgs e)... 
protected void ddlEngine_SelectedIndexChanged(object sender, EventArgs e)... 
protected void ddlAspiration_SelectedIndexChanged(object sender, EventArgs e)... 
protected void btnVehicleGo_Click(object sender, ImageClickEventArgs e)... 

基本上它是一個級聯下拉列表。在Year上選擇某個值時,它將填充Make等。

現在我的問題是,我需要將標記移動到母版頁並保留內容頁上的邏輯。我將如何能夠實現這一目標?我有什麼選擇和/或替代方案?

回答

1

像這樣的事情會做的伎倆在你的後面內容頁面代碼:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 

    DropDownList ddlYear = ((SiteMaster)this.Master).FindControl("ddlYear") as DropDownList; 
    ddlYear.SelectedIndexChanged += new EventHandler(ddlYear_SelectedIndexChanged); 
} 

void ddlYear_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    throw new NotImplementedException(); 
} 

你將需要刪除OnSelectedIndexChanged從下拉母版頁上列出的屬性。您還需要用您的母版頁的類型替換SiteMaster。

這將起作用,但您可能會考慮將事件處理程序保留在母版頁中,並在母版頁中公開新的事件,並在下拉列表發生變化時觸發。這將消除您的子頁面需要知道母版頁上的控件名稱,這是不理想的。

更新: 如果DropDown列表需要專門用於佈局,請在主頁面添加一個額外的ContentTemplate。這將允許您將DropDowns放置到需要顯示的位置,但在「內容」頁面中維護該邏輯。這將比在一個地方使用一半的代碼更清潔,另一半使用FindControl來連接兩者。

+0

試過了。儘管如此,我遇到了有關內容的問題,看起來像是更新面板的問題。問題#1:它不刷新內容。事件雖然被觸發了。問題#2:當我第二次在下拉列表中選擇一個值時,它會刷新整個頁面並且內容無效。我只是在我有的第一個DropDownList上測試它,這是ddlYear。和我ddlYears事件,我有這樣的代碼: – 2010-08-05 19:36:46

+0

保護無效ddlYear_SelectedIndexChanged(對象發件人,EventArgs的){ HtmlGenericControl divVehicleFilter =(HtmlGenericControl)this.Master.FindControl( 「divVehicleFilter」); (UpdatePanel)divVehicleFilter.FindControl(「upVehicleFilter」); DropDownList ddlMake =(DropDownList)upVehicleFilter.FindControl(「ddlMake」); DropDownList ddlModel =(DropDownList)upVehicleFilter.FindControl(「ddlModel」); DropDownList ddlEngine =(DropDownList)upVehicleFilter.FindControl(「ddlEngine」); – 2010-08-05 19:37:25

+0

DropDownList ddlAspiration =(DropDownList)upVehicleFilter.FindControl(「ddlAspiration」); DropDownList ddlEngVin =(DropDownList)upVehicleFilter.FindControl(「ddlEngVin」); //製作 ddlMake.Items.Clear(); (new ListItem(「Select Make ...」,「 - 1」)); 使用(數據表DT = GetVehicleMake()){ 的foreach (DataRowView的在dt.DefaultView RV) { ddlMake.Items.Add(新的ListItem(RV [ 「製作」]。的ToString()。修剪(), RV [ 「製作」]的ToString()修剪()))。。 } } – 2010-08-05 19:37:46