2010-06-15 50 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

相关问题