1

階層検索を行うページがあります。ドロップダウンリストで始まり、ドロップダウンで選択された値に基づいて、データベースにクエリを実行し、子を別のドロップダウンリストに表示します。これは、リーフにヒットする限り続きます...そのため、最初にドロップダウンを動的に追加し、SelectedIndexChanged にイベント ハンドラーを設定しました。選択した値を変更すると、ポストバックがトリガーされますが、イベント ハンドラー メソッドは呼び出されません。ここで何が間違っているのかわかりません。バグですか??

セッション変数を使用して、作成されたコントロールを追跡する

private List<DynamicControlProperties> PersistedControls 
    {
        get
        {
            if (_persistedControls == null)
            {
                if (Session[PersistedControlsKey] == null)
                {
                    Session[PersistedControlsKey] = new List<DynamicControlProperties>();
                }

                _persistedControls = Session[PersistedControlsKey] as List<DynamicControlProperties>;
            }

            return _persistedControls;
        }
    }

Page Init では、動的に生成されたコントロールを再作成します。

protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);

        // regenerate the persisted controls
        foreach (var prop in PersistedControls)
        {
            CreateControl(prop);
        }

    }

ページの読み込みで、最初のドロップダウンを作成しました

protected void Page_Load(object sender, EventArgs e)
    {


        if (!Page.IsPostBack)
        {
           // create the control
            CreateControl(....)

           // bind the data to the dropdown
         }
   }

コントロールメソッドの作成では、ラベルとドロップダウンを作成して、それを a 内にラップし、プレースホルダーに追加するだけです

private DropDownList CreateControl(DynamicControlProperties dynamiccntrlprop)
    {
        // create a new HTML row
        HtmlGenericControlWithParentID tr = new HtmlGenericControlWithParentID("tr");
        HtmlGenericControlWithParentID td1 = new HtmlGenericControlWithParentID("td");
        HtmlGenericControlWithParentID td2 = new HtmlGenericControlWithParentID("td");

        // make sure we set the id and parentid
        tr.ID = string.Format("tr{0}", dynamiccntrlprop.ID);            
        tr.ParentID = dynamiccntrlprop.ParentID;
        tr.EnableViewState = true;

        // create a new label for dropdown
        Label lbl = new Label() { ID = string.Format("lbl{0}", dynamiccntrlprop.DisplayName), Text = dynamiccntrlprop.DisplayName };

        // create a new dropdown list
        DropDownList ddl = new DropDownList()
        {
            ID = string.Format("ddl{0}", dynamiccntrlprop.DisplayName),

            // set the postback
            AutoPostBack = true,

            EnableViewState = true
        };

        // subscribe for the select index changed event
        ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);

        // add the controls to table row
        td1.Controls.Add(lbl);
        td2.Controls.Add(ddl);

        tr.Controls.Add(td1);
        tr.Controls.Add(td2);

        // add the control to place holder     
        this.filtersPlaceHolder.Controls.Add(tr);

        return ddl;

    }

これがインデックス変更ハンドラーです。

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

viewstate、autopostback 何とか何とか何とかを有効にしました... ポストバックで同じ id のコントロールを再作成しました.. Google ですべての答えを試しました..しかし運がありません..インデックスを変更したがイベントを呼び出さなかったときにポストバックをトリガーしますハンドラーメソッド..

何かアイデアをお願いします???

どうもありがとう、K

4

2 に答える 2

1

CreateControl メソッドが各ページのポストバックで呼び出されることを確認する必要があります。これは、動的コントロールのイベント ハンドラーがポストバック後に確実に接続されるようにするために発生する必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    // you shouldn't wrap the call to CreateControl in this 'if' statement
    //if (!Page.IsPostBack)
    //{
           // create the control
            CreateControl(....)

           // bind the data to the dropdown
    //}
}

これを行うと、selected index changed イベントが発生します。

于 2012-04-11T02:18:44.063 に答える
1

たぶん、ドロップダウンリストの新しい値がロードされていないためです。protected override void LoadViewState(object savedState) {

    // regenerate the persisted controls
    foreach (var prop in PersistedControls)
    {
        CreateControl(prop);
    }

    base.LoadViewState(savedState);
}
于 2012-04-11T02:21:48.380 に答える