如何从自定义用户控件中刷新父页面?

时间:2014-04-24 15:54:56

标签: c# asp.net webforms postback

我有一个包含多个自定义.ascx控件的aspx页面。 aspx左侧有一个主菜单。在名为getmenu()的方法中,页面加载时生成菜单。

我遇到的问题是页面上还有一些自定义控件,这些控件导致父页面回发,这会丢失我的菜单。

在父页面中,每当点击完成时,我通常会再次初始化getmenu()方法并重建它,但在控件中我无法访问该方法。

我想知道如何刷新父页面,以便生成菜单,就像它从未消失一样。

这是父页面母版页中的getMenu()方法:

    public void getMenu()
        {
            DataTable table = new DataTable();

     // get the connection
            try
            {
                using (SqlConnection conn = new SqlConnection(GetConnection.GetConnectionString()))
                {
                    DataSet ds = new DataSet();
                    SqlCommand sqlComm = new SqlCommand("PL_Menu_Module_Get", conn);
                    sqlComm.Parameters.AddWithValue("@UserID", UserID);

                    sqlComm.CommandType = CommandType.StoredProcedure;

                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = sqlComm;

                    da.Fill(table);

                }



                // populate the parent node first

                DataView view = new DataView(table);

                view.RowFilter = "ParentMenuId is NULL";

                foreach (DataRowView row in view) //Level 1
                {
                    CreateDiv(row["MenuName"].ToString(), row["MenuUrl"].ToString(), 1, row["ParentMenuId"].ToString(), row["MenuId"].ToString());

                    DataView child = new DataView(table);
                    child.RowFilter = "ParentMenuId =" + row["MenuId"].ToString();

                    foreach (DataRowView rowchild in child) //Level 2
                    {
                        CreateDiv(rowchild["MenuName"].ToString(), rowchild["MenuUrl"].ToString(), 2, rowchild["ParentMenuId"].ToString(), rowchild["MenuId"].ToString());

                        DataView child2 = new DataView(table);
                        child2.RowFilter = "ParentMenuId =" + rowchild["MenuId"].ToString();
                        foreach (DataRowView rowchild2 in child2) //Level 3
                        {
                            CreateDiv(rowchild2["MenuName"].ToString(), rowchild2["MenuUrl"].ToString(), 3, rowchild2["ParentMenuId"].ToString(), rowchild2["MenuId"].ToString());
                        }

                    }

                }



            }
            catch (SqlException ex)
            {
                ExceptionHandling.SQLException(ex, constPageID, constIsSiteSpecific);
            }
}

该控件被添加到使用该母版页的default.aspx。

1 个答案:

答案 0 :(得分:0)

虽然我根据您提供的说明严重怀疑您的设置,但您可以使用的一种技术是事件系统。

在自定义控件中,您可以拥有事件声明:

public event EventHandler MyEvent;

您希望提出该事件的条件:

On Control Load {
    if(MyEvent != null) {
        MyEvent(this, EventArgs.Empty);
    }
}

然后您的父页面可以订阅您的控件的事件:

myCustomControl.MyEvent += (object, sender) => Refresh();