DataGrid嵌套DataGrid,子DataGrid怎么就不执行我添加的事件?

ztwz 2007-07-21 11:28:37
RT下面是部分代码!
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!this.IsPostBack )
{
dgTitleBind();//绑定父DataGrid
}
this.btnAdds .Attributes .Add ("onclick","return pagecheck()");
}
------------------------------------------------------------------------
private void dgTitle_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
YNJW.CWCN .Business .BLL .testAnswer answer=new YNJW.CWCN.Business.BLL.testAnswer ();
if(e.Item .ItemType ==ListItemType.AlternatingItem ||e.Item .ItemType ==ListItemType.Item )
{
DataGrid dgAnswer=(DataGrid)e.Item .FindControl ("dgAnswer");//找到嵌套在datagrid中的datagrid
dgAnswer.DataSource =answer.GetList ("testId="+dgTitle.DataKeys [e.Item .ItemIndex ].ToString ());//绑定
dgAnswer.DataBind ();
//给子DataGrid添加事件
dgAnswer.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAnswer_CancelCommand);
dgAnswer.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAnswer_EditCommand);
dgAnswer.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAnswer_UpdateCommand);
dgAnswer.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAnswer_DeleteCommand);
}
}
-----------------------------------------------------------------------
//这是子DataGrid控件的编辑事件,但我设过断点,根本就不执行这个事伯嘛.
private void dgAnswer_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid dgAnswer=(DataGrid)e.Item .FindControl ("dgAnswer");
dgAnswer .EditItemIndex =e.Item .ItemIndex ;
dgTitleBind();
}

/////////////////////////////////////////////////////////////////////
为什么我为子控件添加的事件他不执行.是哪做错了嘛!请指点一下.
第一个解决这问题的.给50分!
...全文
735 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
honey52570 2007-07-22
  • 打赏
  • 举报
回复
顶一个
ztwz 2007-07-22
  • 打赏
  • 举报
回复
问题搞定,谢谢大家的帮助!说明一下DataGrid1是父,DataGrid2是嵌套的子控件!
下面是偶做的方法!
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
YNJW.CWCN .Business .BLL .UserInfo bUser=new YNJW.CWCN.Business.BLL.UserInfo ();
YNJW.CWCN .Business .Model .UserInfo mUser=new YNJW.CWCN.Business.Model.UserInfo ();

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!this.IsPostBack )
{
bind();
}
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DataGrid1.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemCreated);
this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
private void bind()
{
//绑定父控件
this.DataGrid1 .DataSource =bUser.GetList ("");
this.DataGrid1 .DataBind ();
}

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item .ItemType ==ListItemType.AlternatingItem ||e.Item.ItemType ==ListItemType.Item )
{//绑定子datagrid
DataGrid dg=(DataGrid)e.Item .FindControl ("Datagrid2");
dg.DataSource =bUser.GetList ("");
dg.DataBind ();
}
}

//子控件datagrid2的编辑事件
private void DataGrid2_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{ //找到子控件
DataGrid DataGrid2=(DataGrid)e.Item.Parent .Parent ;
DataGrid2 .EditItemIndex =e.Item .ItemIndex ;//进入编辑模板
DataGrid2.DataSource =bUser.GetList ("");
DataGrid2.DataBind ();
}

private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{//给子datagrid添加事件
if(e.Item .ItemType ==ListItemType.AlternatingItem ||e.Item.ItemType ==ListItemType.Item )
{
DataGrid DataGrid2=(DataGrid)e.Item .FindControl ("DataGrid2");
DataGrid2.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(DataGrid2_EditCommand);
DataGrid2.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(DataGrid2_UpdateCommand);
}
}

//更新子datagrid中的内容
private void DataGrid2_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid DataGrid2=(DataGrid)e.Item.Parent .Parent ;
TextBox txtEdit=(TextBox)e.Item .FindControl ("txtEdit");
mUser=bUser.GetModel (Convert.ToInt32 (DataGrid2.DataKeys [e.Item .ItemIndex ].ToString ()));
mUser .UserName =txtEdit.Text .Trim ();
bUser.Update (mUser);
DataGrid2.EditItemIndex =-1;
DataGrid2.DataSource =bUser.GetList ("");
DataGrid2.DataBind ();
}


}
  • 打赏
  • 举报
回复
其实早已经有2年不使用DataGrid了。

DataGrid只有在DataBind的时候才为每一行重新绑定数据并触发 ItemDataBound 事件,在postback初始装载时它仅仅创建控件树而并不绑定数据。如果确实如此,那么你的设计逻辑错误,应该放在ItemCreated中。
mangshuo 2007-07-21
  • 打赏
  • 举报
回复
关注..呵呵
ztwz 2007-07-21
  • 打赏
  • 举报
回复
MicroSoftor(http://blog.sina.com.cn/zhouzimimi) ( ) 信誉:100 2007-07-21 11:43:16 得分: 0


根据CommandName


----------------------------------------------------
private void dgTitle_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.CommandName =="edit")
{
string k="sf";
}
}
偶子datagrid中的修改commandname也是edit偶在if(e.CommandName =="edit")设了断点他点击修改没进来.
----------------------------------------------------------------------
sp1234(与其赌博赚钱,不如自己开赌场) ( ) 信誉:98 2007-07-21 11:45:09 得分: 0



dgAnswer.EditCommand += new ......
那一行设置断点,检查postback之后是否执行了。


-----------------------------------------------------------------------
postback没有执行:(
xuyiazl 2007-07-21
  • 打赏
  • 举报
回复
设置 CommandName = edit 和datalist的操作一样~
  • 打赏
  • 举报
回复

dgAnswer.EditCommand += new ......
那一行设置断点,检查postback之后是否执行了。
MicroSoftor 2007-07-21
  • 打赏
  • 举报
回复
根据CommandName
ztwz 2007-07-21
  • 打赏
  • 举报
回复
MicroSoftor(http://blog.sina.com.cn/zhouzimimi) ( ) 信誉:100 2007-07-21 11:38:09 得分: 0


你可以在最外层的DataGird中捕获这个事件,然后再在其中进行判断,这个事件是内部Grid的什么地方发出


--------------------------------------------------------------------------------
传说中的事件冒泡?
请详细一点,在外层DataGrid中的哪个事件中来捕获?
怎么判断事件?
MicroSoftor 2007-07-21
  • 打赏
  • 举报
回复
你可以在最外层的DataGird中捕获这个事件,然后再在其中进行判断,这个事件是内部Grid的什么地方发出
ztwz 2007-07-21
  • 打赏
  • 举报
回复
xuyiazl(女人?火星动物!地球很危险,快回去! =.=!!!) ( ) 信誉:100 2007-07-21 11:33:23 得分: 0


你试过 在摸板列中 点里面的那个grid右键属性 里面的事件触发 没 ?

代码貌似没看出什么毛病啊`


-----------------------------------------------------------------------
在模板列中子控件属性找不到他的事件:(
所以才手动添加事件的嘛!
MicroSoftor 2007-07-21
  • 打赏
  • 举报
回复
不好意思,没注意你已经添加事件了
不过有点比较怀疑
你将事件定义在dgTitle_ItemDataBound中时,是想所有DataGrid都会执行相同的事件添加?
xuyiazl 2007-07-21
  • 打赏
  • 举报
回复
你试过 在摸板列中 点里面的那个grid右键属性 里面的事件触发 没 ?

代码貌似没看出什么毛病啊`
ztwz 2007-07-21
  • 打赏
  • 举报
回复
偶不是添加了事件了嘛!
难道添加事件的方法不对,不应该在ItemDataBound添加?
MicroSoftor 2007-07-21
  • 打赏
  • 举报
回复
这是肯定的,这个和模板列中的控件不是很相似么

只要动态添加事件就可以解决问题
xuyiazl 2007-07-21
  • 打赏
  • 举报
回复
先顶
vainnetwork 2007-07-21
  • 打赏
  • 举报
回复
顶了在说
amandag 2007-07-21
  • 打赏
  • 举报
回复
通常的做法是在前台(aspx)页面中就绑定事件处理程序,在后台直接处理

楼主可以把你的需求再描述明确些,看有没有更好的解决方案
Jinglecat 2007-07-21
  • 打赏
  • 举报
回复
1。
// ...
//给子DataGrid添加事件
// ...

=========

真把 WebForm 当 WinForm 使唤啊 ?

2。
使用显示添加事件处理程序得在 Page 生命周期处理 控件事件阶段完成,通常在 Page Init 或者更早,
而你是在 DataGrid 的 ItemDataBound 添加(此时已经倒控件事件阶段了),至多只有下一次会执行你绑定的事件处理程序一次!!!

考虑换用 ItemCreated 事件中处理

3。
最佳方式是,直接使用页面声明方式

<asp:datagrid runat=server ...
<columns>
<asp:templatecolumn>
<itemtemplate>
<asp:datagrid runat=server onCancelCommand=dgAnswer_CancelCommand .....
<columns>


Human_Heart 2007-07-21
  • 打赏
  • 举报
回复
建议换一种思路!

当点击第一个 DataGrid 时

再将记录绑定到 第二个 DataGrid 上。

你的这种做法太汗了!!!:)
加载更多回复(2)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧