我在一个index.aspx页面中加了两个用户控件,一个是菜单,一个是TAB,在菜单控件中选了一个菜单点击后我要让TAB控件中加载相关的TAB,该如何实现?是不是用GET,SET之类的方法?我试了半天,就是不能在index.aspx.cs中调到菜单控件,请大家帮帮忙。
首先菜单上面是有click事件的,点周后菜单的值也取得到,然后就提交页面了,这时候菜单控件,index,TAB的page_load事件都触发了,而我的TAB控件添加TAB应该是在PAGE_LOAD的时候做的,这中间的处理弄得我很头疼,大家指点指点我吧,唉
首先菜单上面是有click事件的,点周后菜单的值也取得到,然后就提交页面了,这时候菜单控件,index,TAB的page_load事件都触发了,而我的TAB控件添加TAB应该是在PAGE_LOAD的时候做的,这中间的处理弄得我很头疼,大家指点指点我吧,唉
---------------------------------------------------
不知道你的TAB控件是什么东西,但是一点很清楚,它应该可以用属性或者方法去改变内容,而不是在 它自己的page_load中“无厘头”地去自己设置自己。事件驱动的编程方法,在windows中很普遍了,最近15的windows编程书籍基本上都是这一工程体系,不同用例处理流程被离散设计在不同的方法体里边。web编程也不是全都那么落后,至少asp.net不落后,完全支持传统的开发方法。如果“菜单_onclick”中间处理操作流程是对的,“我的TAB控件添加TAB应该是在PAGE_LOAD的时候做”就一定是错的。
这是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那样,根本无需知道包含它的页面对象是谁!
2.用全局变量 Session Application 等