2

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

我有一个名为 a 的页面Index.aspxDropDownList它是一个单独的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。

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

议程.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。

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

你们能帮帮我吗?

4

1 回答 1

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 在从回发数据的控件捕获数据之前触发。所以这是一个获取他们信息的不好的地方,因为它将是以前的样子。这就是为什么您需要创建一个函数,该函数会在加载控件数据后执行按钮单击之类的操作。

于 2012-10-05T01:02:21.970 回答