2010-06-15 48 views
0

我創建了一個自定義控件,它是具有指定項目的DropDownList。我設計了AutoPostbackSelectedCategoryId作爲屬性,並將SelectedIndexChanged設計爲我的自定義控件的事件。
這是我的ASCX文件中的代碼背後:
自定義控件中DropDownList的索引沒有變化!

private int _selectedCategoryId; 

private bool _autoPostback = false; 

public event EventHandler SelectedIndexChanged; 

public void BindData() 
{ 
    //Some Code... 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    BindData(); 
    DropDownList1.AutoPostBack = this._autoPostback; 
} 

public int SelectedCategoryId 
{ 
    get 
    { 
     return int.Parse(this.DropDownList1.SelectedItem.Value); 
    } 
    set 
    { 
     this._selectedCategoryId = value; 
    } 
} 

public string AutoPostback 
{ 
    get 
    { 
     return this.DropDownList1.AutoPostBack.ToString(); 
    } 
    set 
    { 
     this._autoPostback = Convert.ToBoolean(value); 
    } 
} 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (SelectedIndexChanged != null) 
     SelectedIndexChanged(this, EventArgs.Empty); 
} 

我想使用的更新面板,以更新文本框字段根據村落下拉列表中選擇指標。
這是我在ASPX頁面代碼:

<asp:Panel ID="PanelCategory" runat="server"> 
    <p> 
     Select Product Category:&nbsp; 
     <myCtrl:CategoryDDL ID="CategoryDDL1" AutoPostback="true" OnSelectedIndexChanged="CategoryIndexChanged" 
      SelectedCategoryId="0" runat="server" /> 
    </p> 
    <hr /> 
</asp:Panel> 
<asp:UpdatePanel ID="UpdatePanelEdit" runat="server"> 
    <ContentTemplate> 
     <%--Some TextBoxes and Other Controls--%> 
    </ContentTemplate> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="CategoryDDL1" /> 
    </Triggers> 
</asp:UpdatePanel> 

但總是CategoryDDL1所選擇的指數是0(默認值一樣)。這意味着只有零值會傳遞給事件來更新文本框數據。我的代碼有什麼問題?爲什麼選擇的索引不更改?幫幫我?

+0

您需要確保已經在控件中顯示了下拉列表的SelectedIndex。 'CategoryDDL1'是一個用戶控件,並且不會立即顯示嵌套控件的SelectedIndex屬性。所以,就像你有'SelectedCategoryId'一樣,你應該有'SelectedIndex'返回'Dro​​pDownList1.SelectedIndex' – 2010-06-15 23:05:25

回答

1

如果您BindData()方法是完全獨立的,移動從Page_Load中到:

protected override void OnInit(EventArgs e) 
{ 
    BindData(); 
} 

這會在你的控制你的下拉列表,從正對每一個頁面加載,我認爲反彈的問題來自您發佈的代碼。

但是,如果你的BindData()方法需要從父頁信息,更改頁面加載到:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!this.Page.IsPostback) { 
     BindData(); 
    } 
    DropDownList1.AutoPostBack = this._autoPostback; 
} 

這將允許只在第一頁加載被束縛你的下拉菜單,以及隨後的載荷必須能夠正確訪問屬性。

此外,一定要檢查您的ASPX頁面,以確保您沒有綁定ASCX控件的每一頁加載。這可以在父頁面上以相同的方式解決。

+0

謝謝你,但你知道一個ascx文件不是繼承形式的Page Class。所以我們不能使用Page.IsPostback(CMS_Controls_CategoryDropDown:System.Web.UI.UserControl)。我有兩個自定義下拉列表。第一個下拉菜單使用您的代碼修復(覆蓋OnInit),但第二個下拉菜單不會。第二個下拉列表中沒有發生指數變化。你有什麼想法?我的第二個下拉菜單位於更新面板(並顯示父類別),並且其索引將在第一個下拉索引更改時更改。 – mahdiahmadirad 2010-06-15 23:40:06

+0

mahdiahmadirad:用戶控件不從頁面繼承,但所有控件都有一個名爲'Page'的屬性,該屬性引用控件嵌套的頁面。因此,在用戶控件中,您可以使用'this.Page.IsPostback'來驗證父頁面當前是否在回發中。 – 2010-06-16 14:27:50

+0

另外,我不理解與第二個下拉列表的問題。你可以用相關的代碼編輯你的原始帖子嗎?我最初的想法是,你需要在更新面板上設置'UpdateMode ='Conditional'',並在你的事件中調用'UpdatePanelEdit.Update()'。一個例子可以在這裏找到:http://www.ajaxtutorials.com/ajax-tutorials/updating-an-updatepanel-programmatically-in-c/ – 2010-06-16 14:32:16

相關問題