我在一个index.aspx页面中加了两个用户控件,一个是菜单,一个是TAB,在菜单控件中选了一个菜单点击后我要让TAB控件中加载相关的TAB,该如何实现?是不是用GET,SET之类的方法?我试了半天,就是不能在index.aspx.cs中调到菜单控件,请大家帮帮忙。  
首先菜单上面是有click事件的,点周后菜单的值也取得到,然后就提交页面了,这时候菜单控件,index,TAB的page_load事件都触发了,而我的TAB控件添加TAB应该是在PAGE_LOAD的时候做的,这中间的处理弄得我很头疼,大家指点指点我吧,唉

解决方案 »

  1.   

    你说的问题好像比较多。我就假设你能够正确取得菜单的值,并且也知道怎么让TAB显示该显示的页。这些都可以通过看书或者控件上的说明和例子照猫画虎的学到。要把他们组织他们在一起的问题,一个原则:用户控件之间没有关系,不负责相互联系!页面把他们聚合在一起,所以页面负责接收菜单的按键事件,然后控制TAB的显示。所以,控制 TAB 控件正确显示的代码一定放在“菜单_onclick”事件中,而不在page_load中。
      

  2.   

    而我的TAB控件添加TAB应该是在PAGE_LOAD的时候做的
    ---------------------------------------------------
    不知道你的TAB控件是什么东西,但是一点很清楚,它应该可以用属性或者方法去改变内容,而不是在 它自己的page_load中“无厘头”地去自己设置自己。事件驱动的编程方法,在windows中很普遍了,最近15的windows编程书籍基本上都是这一工程体系,不同用例处理流程被离散设计在不同的方法体里边。web编程也不是全都那么落后,至少asp.net不落后,完全支持传统的开发方法。如果“菜单_onclick”中间处理操作流程是对的,“我的TAB控件添加TAB应该是在PAGE_LOAD的时候做”就一定是错的。
      

  3.   

    我刚刚解决了这个问题,大家看看方法好不好,正不正规。有好一点的方法的请提出。
    这是MenuBar 控件,解决的方法主要看第一行和最后两个函数,我用的是事件委托方法,回复的最后我会给出我参考的文章,那个的解释会明白些,反正我就是把菜单的点击事件放到index.aspx里做了。
    public delegate void ClickEventHandler(object sender, Infragistics.WebUI.UltraWebNavigator.WebMenuItemEventArgs e); public class MenuBar : System.Web.UI.UserControl
    {
    protected Infragistics.WebUI.UltraWebNavigator.UltraWebMenu UltraWebMenu1;
    protected System.Web.UI.WebControls.Label Label1;
    protected DataTable dataTblTree;
    public string NodeName; private void Page_Load(object sender, System.EventArgs e)
    {
    if(!Page.IsPostBack)
    {
    InitMenuDataTable();
    FormatVEToTree_root(dataTblTree,1);
    }
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器
    /// 修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.Load += new System.EventHandler(this.Page_Load);
    this.UltraWebMenu1.MenuItemClicked += new Infragistics.WebUI.UltraWebNavigator.MenuItemClickedEventHandler(this.UltraWebMenu1_MenuItemClicked);
    }
    #endregion private void InitMenuDataTable()
    {
    Database data = new Database();
    SqlDataReader dataReader = null;
    //String UserID = Request.Cookies["UserID"].Value.ToString();'
    String UserID="admin";
    SqlParameter[] prams = {
       data.MakeInParam("@Engname",      SqlDbType.VarChar , 50, UserID)

       };
    try
    {
    data.RunProc("sp_GetUserMenu", prams,out dataReader);
    }
    catch(Exception ex)
    {
    Response.Write(ex.ToString());
    }
    DataTrans datatrans=new DataTrans();
    dataTblTree = datatrans.ConvertDataReaderToDataTable(dataReader);
    dataReader.Close();
    dataTblTree.TableName = "TreeView";
    } private void FormatVEToTree_root(DataTable TreeTB,int RootID)
    {
    DataView TreeVE  = new DataView();
    TreeVE    = TreeTB.Copy().DefaultView ;
    TreeVE.RowFilter = "ParentMenuID = "+RootID.ToString();
    int myCount=TreeVE.Count;
    for (int i = 0; i < myCount; i++)   
    {
    Item myitem;
    myitem = UltraWebMenu1.Items.Add(TreeVE[i]["Description"].ToString());
    myitem.DataKey=TreeVE[i]["ID"].ToString();
    myitem.Style.Width=new Unit("100px"); 
    FormatVEToTree_Child(TreeTB,myitem);
    }
    Item childItem1;
    childItem1 = UltraWebMenu1.Items.Add(""); 
    childItem1.Enabled=false;
    }

    private void FormatVEToTree_Child(DataTable TreeTB,Item MenuItem)
    {
    DataView TreeVE  = new DataView();
    TreeVE    = TreeTB.Copy().DefaultView ;
    TreeVE.RowFilter = "ParentMenuID = "+MenuItem.DataKey;
    int myCount=TreeVE.Count;
    for (int i = 0; i < myCount; i++)   
    {
    Item myitem;
    myitem = MenuItem.Items.Add(TreeVE[i]["Description"].ToString());
    myitem.DataKey=TreeVE[i]["ID"].ToString();
    FormatVEToTree_Child(TreeTB,myitem); } } private void UltraWebMenu1_MenuItemClicked(object sender, Infragistics.WebUI.UltraWebNavigator.WebMenuItemEventArgs e)
    {
    //TabsPage myTabsPage=new TabsPage();
    //myTabsPage.addnewtab(e.Item.Text);
    //Label1.Text=this.Parent.FindControl("Tabs").ToString();
    //NodeName=e.Item.Text;
    this.OnClick(e);
    } public event ClickEventHandler Click;
    protected void OnClick(Infragistics.WebUI.UltraWebNavigator.WebMenuItemEventArgs e) 
    {
    if (Click!=null) Click(this, e); 
    } }
    下面是INDEX里的代码,其中TABS是TAB控件的ID
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load);
    MenubarTop.Click += new ClickEventHandler(this.UserControl_Clicked);
    }
    #endregion private void UserControl_Clicked(object sender, Infragistics.WebUI.UltraWebNavigator.WebMenuItemEventArgs e)
    {
    Tabs.addnewtab(e.Item.Text);
    }
    参考文章:
    ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持。本文讨论用户控件返回事件的方法。假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收到事件。为此,小鸡射手在用户控件和页面的代码中分别作了处理。UserControl.ascx.cs中的处理:
    1. 定义public的事件委托,如ClickEventHandler;
    2. 在UserControl类中声明事件,如Click;
    3. 在UserControl类中定义引发事件的方法,如OnClick()方法;
    4. 在UserControl类的相关方法中调用引发事件的方法,如在Button_Click()中调用OnClick()。核心代码示意如下:
    public delegate void ClickEventHandler(object sender, EventArgs e);
    public class MyUserControl : System.Web.UI.UserControl
    {
    protected System.Web.UI.WebControls.Button AButton;
    public event ClickEventHandler Click;
    protected void OnClick(EventArgs e) 
    {
    if (Click!=null) Click(this, e); 
    }
    private void AButton_Click(object sender, System.EventArgs e)
    {
    this.OnClick(e);
    }
    }包含UserControl的页面cs文件中的处理:
    1. InitializeComponent()中增加事件处理程序,采用FindControl方法找到UserControl;
    2. 定义事件处理方法,在该方法中处理UserControl的事件,如UserControl_Clicked()。
    核心代码示意如下:
    private void InitializeComponent()

    this.Load += new System.EventHandler(this.Page_Load);
    MyUserControl uc = this.FindControl("myUserControlID") as MyUserControl;
    uc.Click += new ClickEventHandler(this.UserControl_Clicked);
    }
    private void UserControl_Clicked(object sender, System.EventArgs e)
    {
    // UserControl_Clicked event hanlder
    }总结一下,其实就是将事件机制利用手工编程的方法加进去:加入一般控件IDE自动生成的代码。顺便说一下,C#的事件机制实现了Obeserver pattern,除了UI还可以用于业务层,能有效地降低对象间的耦合度,像UserControl那样,根本无需知道包含它的页面对象是谁!
      

  4.   

    1.可以用地址栏URL
    2.用全局变量 Session Application 等
      

  5.   

    楼主的解决方法好啊,耦合度对于这两者的重用性具有非常大的影响,如果用URL或者SESSION的话,一般要把对这些东东的操作写入USER CONTROL的逻辑里,耦合度大,你也不想浪费了你的USER CONTROL们