2

私はこれを理解するのに苦労しています。皆さんが私を助けてくれることを願っています。

別のクラスであると呼ばれるページがあります(他のページで使用されるためIndex.aspx)。そのためのコードは次のとおりです。DropDownListUserControl

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と、ページはフォームアクションページに送信されます。

他のページで問題が始まります。このページに投稿されたパラメーターを取得し、そのうちの1つが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に再度変更します。上記の同じコードをデバッグすると、が1になっていることがわかりlocais.SelectedIndexます。ここでも、通常どおり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 に答える