1

DropDownList を含む CompositeControl があります。

DropDownList の AutoPostBack プロパティを true に設定しました。

ページには、次のものがあります。

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <MyControl:Control ID="CustomControl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

ChildrenAsTriggers="true"UpdateMode="Always "も設定しようとしましたが、どちらも問題を解決しませんでした。

問題は、UpdatePanel が CompositeControl の DropDownList のポスト バックをインターセプトしていないことです。(DropDownList が変更されると、完全な POST が実行されます)

UpdatePanel でポストバックを処理するにはどうすればよいですか?

ありがとう!

編集 -- 要求された情報

国と州はどちらも CompositeControl の DropDownLists です。

country.SelectedIndexChanged += new EventHandler(country_SelectedIndexChanged);

protected void country_SelectedIndexChanged(Object sender, EventArgs e)
{
    states.DataSource = XXX;
    states.DataBind();
}
4

4 に答える 4

3

わかりましたので、これは最良の答えではないかもしれませんが、UpdatePanel が子コントロールのイベントを表示できないという問題があると思います。良いニュースは、簡単に修正できることです。コントロール (CatchMyEvent、ちなみに非常に巧妙な名前です) があり、その上に DropDownList があるとします。ここで、親ページで SelectedIndexChanged イベントがそのリストで発生するのを確認し、SelectedItem.Text に一致するようにラベルを更新する必要があります。このままでは、親は本当にそれをすることはできません。それでは、次のように変更しましょう。

public partial class CatchMyEvent : System.Web.UI.UserControl
{
    public delegate void ChangedIndex(object sender, EventArgs e);
    public event ChangedIndex SelectedIndexChanged;

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        dropDownListThrow.SelectedIndexChanged += new EventHandler(dropDownListThrow_SelectedIndexChanged);
        labelOutput.Text = "no";
    }

    public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
    {
        labelOutput.Text = ((DropDownList)sender).SelectedItem.Text;
        if(SelectedIndexChanged != null)
        {
            SelectedIndexChanged(sender, e);
        }
    }
}

基本的に私がしたことは、コントロールに DropDownList の SelectedIndexChanged イベントをキャプチャさせ、それを発生させて、親ページまたはコントロールがそれを見ることができるようにすることだけでした。基本的に、私が行ったすべてのことは、それを渡すことです。親ページでは、非常に簡単にキャプチャできます。

以下を保持するトリガーを使用して UpdatePanel を追加するだけです。

<asp:AsyncPostBackTrigger ControlID="catchMyEventMain" EventName="SelectedIndexChanged" />

...そしてもちろん、これを親ページのコード ビハインドに追加します。

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    catchMyEventMain.SelectedIndexChanged += dropDownListThrow_SelectedIndexChanged;
}

public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{        
    labelSelectedValue.Text = ((DropDownList)sender).SelectedItem.Text;
}

ラベルは前述のラベルです。そして、魔法を起こしましょう。

また、2 つの注意事項:

1) これをテストしたときのように馬鹿にしないでください。DropDownList の AutoPostBack プロパティを true に設定するのを忘れてください。

2) ラベルが UpdatePanel の ContentTemplate にあることを確認します。

お役に立てれば。

于 2008-10-22T14:17:10.620 に答える
2

UpdatePanel 内の ListView で子コントロール (テキスト ボックスとラベル) を繰り返しました。

テキストボックスを変更すると、完全な (同期) ポストバックが発生します。

PAGE 要素 (.aspx ページの最初の行) を追加しました: ClientIDMode="AutoID"

これで問題が修正され、必要に応じて UpdatePanel のみが更新されるようになりました。

于 2013-08-29T18:31:34.700 に答える
0

BuildControlHierarchyの最後に次のようにしました。

        ...
        if (DesignMode || Page == null) return;

        var sm = ScriptManager.GetCurrent(Page);
        if (sm == null)
        {
            throw new MissingFieldException("The ScriptManager is needed on the page!");
        }
        sm.RegisterAsyncPostBackControl(<control which initiates async postback>);
于 2008-12-08T12:53:00.470 に答える
0

階層全体のすべてのコントロールに ID が設定されていることを確認してください。

この質問を参照してください。

于 2010-08-17T09:30:47.603 に答える