在webform中,在一个用户定义控件中调用另一个用户定义控件中的方法,应该如何处理?
在我的webform中有两个用户控件,一个是“人员列表的treeview”,一个是“人员信息的DataGrid”。我在人员信息的DG用户控件中写了一些方法用于显示数据等。现在我在人员列表用户控件中,想将选择的人员编码,传递给人员信息DataGrid中的显示数据方法,应该如何作。或者说,我直接想在“人员列表用户控件”中调用“人员信息DG用户控件”中的方法,应该如何处理? 问题点数:20、回复次数:10Top
1 楼rice139301(大米)回复于 2003-09-03 20:02:17 得分 0
用户对象1:workbrowse.ascx
//***
private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
{
}
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
}
public void DataBrowse(String employeestr)
{
SqlConn conn = new SqlConn();
conn.Open();
SqlDataAdapter da = new SqlDataAdapter("select * from t_work_log where employee_code='"+employeestr+"'",conn.constr);
DataSet ds = new DataSet();
da.Fill(ds,"t_work_log");
DataGrid1.DataSource = ds.Tables["t_work_log"];
DataGrid1.DataBind();
conn.Close();
}
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
}
用户对象2:treeview.ascx
//***
public abstract class treeview : WorkBrowse
Session["employee_code"] = newemployecode;
//页面刷新后再执行DataBrowse(Session["employee_code"].ToString());
base.DataBrowse(newemployecode);Top
2 楼rice139301(大米)回复于 2003-09-03 20:04:15 得分 0
用户对象2:treeview.ascx
//***
public abstract class treeview : WorkBrowse
private void TreeView1_SelectedIndexChange(object sender, Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e)
{
//选择某员工节点时,DG中数据进行检索
Microsoft.Web.UI.WebControls.TreeNode mynode=TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex);
String newemployecode = mynode.ID.ToString();
Session["employee_code"] = newemployecode;
//页面刷新后再执行DataBrowse(Session["employee_code"].ToString());
base.DataBrowse(newemployecode);
}
此时运行报错如下:
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 42: private void InitializeComponent()
行 43: {
行 44: this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
行 45: this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
行 46: this.LinkButton1.Click += new System.EventHandler(this.LinkButton1_Click);
源文件: workbrowse.ascx.cs 行: 44
//************************************************
为什么?
}
Top
3 楼rice139301(大米)回复于 2003-09-04 11:42:51 得分 0
self up!Top
4 楼chnking(kent)回复于 2003-09-04 11:50:23 得分 20
在这两个控件的容器aspx页面中,通过“人员列表的treeview”公开的属性取得已选择的人员编码,然后调用“人员信息的DataGrid”中一个公开的根据人员编码获取数据并绑定datagrid的方法:GetAndBind(string id).
两个控件之间不用直接发生关系的。Top
5 楼rice139301(大米)回复于 2003-09-04 12:00:13 得分 0
楼上说的,我都做了,问题是现在我想在用户选择treeview中的人员编码时,DG中的信息发生检索操作。这个代码我现在是写在treeview中的,我现在无法调用到"人员信息"控件中的GetandBind()这个方法。Top
6 楼rice139301(大米)回复于 2003-09-04 12:12:49 得分 0
同志们帮帮忙呀,很着急呀Top
7 楼chnking(kent)回复于 2003-09-04 12:31:51 得分 0
“这个代码我现在是写在treeview中的”,把这部分代码提出来,放到aspx页面中,然后由aspx页面的代码把选择的人员代码,或已经根据这个代码取得的数据源传给DGTop
8 楼rice139301(大米)回复于 2003-09-04 12:53:23 得分 0
你真高呀,但是我实在想不明白应该如何将treeview中的TreeView1_SelectedIndexChange()方法提到aspx中。可否贴一段code。thanks!Top
9 楼chnking(kent)回复于 2003-09-04 13:17:59 得分 0
不是说要你将TreeView1_SelectedIndexChange()提到aspx中,而是在TreeView1_SelectedIndexChange()中会进行选择后的处理,在你这个例子中主要就是获得已选人员代码。我想你的这个“人员列表的treeview”应该公开一个属性,就是已选人员代码。你在TreeView1_SelectedIndexChange()中更新这个已选人员代码属性,这样在aspx就能通过已选人员代码属性来获取到你选择的人了。
明白?Top
10 楼chnking(kent)回复于 2003-09-04 13:21:13 得分 0
你的思路有问题,用户控件作为一个独立的组件,它不知道将会被放置到什么地方,以及它周围的环境是什么,你不能想着在一个控件中去直接访问另一个控件,因为它周围有什么你不知道。
控件应该通过公开自己的属性和方法来同外界交换信息,根据外界提供的信息完成自己的既定任务。Top




