DropDownList不接受我试图分配的SelectedIndex

时间:2012-10-04 21:07:20

标签: c# asp.net .net

我很难搞清楚这一点,我希望你们能帮助我。

我有一个名为Index.aspx的页面,DropDownList是一个单独的UserControl类(因为它将在其他页面中使用)。这是代码:

UcSelecionarLocal.ascx:

<%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="UcSelecionarLocal.ascx.cs" 
    Inherits="QuickMassage.uc.UcSelecionarLocal" %>
<asp:DropDownList ID="ddlLocais" runat="server" 
                  CssClass="span4 dropdown-toggle" AutoPostBack="true">
</asp:DropDownList>

UcSelecionarLocal.ascx.cs:

public partial class UcSelecionarLocal : UserControl {

  protected void Page_Load(object sender, EventArgs e) {
      if (!this.IsPostBack) {
          PreencherLocais();
      }
  }

  private void PreencherLocais() {
     ddlLocais.Items.Clear();
     ddlLocais.Items.Add(new ListItem("Selecione", "0"));
     ControleLocal controle = new ControleLocal();
     DataTable tab = controle.ListarLocais();
     foreach (DataRow row in tab.Rows) {
        ddlLocais.Items.Add(new ListItem(row["Descricao"].ToString(), 
                                         row["ID"].ToString()));
     }
  }

}

此控件放在Index.aspx中并正确加载其值。它包含的表单将操作设置为agendamentos.aspx。当我更改ddlist时,页面将按原样提交给表单操作页面。

在另一页上,问题开始了:我将参数发布到此页面,其中一个是ddlist值。在即时窗口中,我检查了值,它就在那里,假设它是1。

长话短说,我有这段代码:

agendamentos.aspx.cs:

protected void Page_Load(object sender, EventArgs e) {
        DropDownList locais = ObterComponenteListaLocais();
        try {
            locais.SelectedIndex = 
              int.Parse(HttpContext.Current.Request["ucSelLocal$ddlLocais"]);
        }

调试时,我看到locais.SelectedIndex为-1。作业完成后,它仍为-1。页面加载,然后我再次将ddlist值更改为2.当调试上面的相同代码时,我看到locais.SelectedIndex现在是1.再次,将它设置为2,因为它通常是,没有效果。如果我再次将ddlist更改为3,则SelectedIndex变为2,并且不会取值3.

换句话说:新加载页面中索引的值是之前加载的页面的值。

你们能帮助我吗?

1 个答案:

答案 0 :(得分:2)

这是因为在加载用户控件之前,页面中的Page_Load事件正在触发。这样做:

public partial class UcSelecionarLocal : UserControl
{

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    public void PreencherLocais()
    {
        ddlLocais.Items.Clear();
        ddlLocais.Items.Add(new ListItem("Selecione", "0"));
        ControleLocal controle = new ControleLocal();
        DataTable tab = controle.ListarLocais();
        foreach (DataRow row in tab.Rows)
        {
            ddlLocais.Items.Add(new ListItem(row["Descricao"].ToString(), row["ID"].ToString()));
        }
    }
}

然后在你的aspx页面中:

protected void Page_Load(object sender, EventArgs e) 
{
        if (!IsPostBack)
            this.idOfYourUserControl.PreencherLocais();

        DropDownList locais = ObterComponenteListaLocais();
        try {
            locais.SelectedIndex = 
              int.Parse(HttpContext.Current.Request["ucSelLocal$ddlLocais"]);
        }
}

另外,因为您的问题有点令人困惑,重要的一点是,在从回发数据的控件中捕获数据之前,Page_Load会触发。所以这是一个获取信息的好地方,因为它将是以前的信息。这就是为什么你需要创建一个函数来触发按钮点击之类的东西,它会在加载控件数据后执行。