控件不能修改其父级的控件集合 ,高分求解决方法

ghchen 2005-10-18 11:28:12
dgbrand.Controls.Clear(); 出现如题的异常,dgbrand为datagrid,各位大虾帮忙,谢谢呢
...全文
218 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2005-10-19
  • 打赏
  • 举报
回复
everything is possible, make sure you know how the framework works, think hard, and try to get a better design

good luck
ghchen 2005-10-19
  • 打赏
  • 举报
回复
我只是取dropdownlist所选的内容,不管它有什么变化,加一个控件,我觉得比较麻烦, :)
ghchen 2005-10-19
  • 打赏
  • 举报
回复
差不多明白了,谢谢思归大虾,如果我要重写类能否实现这种功能,大虾能否在再多说一下,不管怎么样,明天结贴,呵呵
ghchen 2005-10-19
  • 打赏
  • 举报
回复
thanks
saucer 2005-10-19
  • 打赏
  • 举报
回复
没说不可以在Page_Load里databind,如果是对子控件的话,但你的重新绑定的结果是,把父控件的子控件集合改变了,把自己消灭了,在Load事件里,框架在对子控件做循环时,不允许对这个子控件集合改变

>>>由于我是用javascript来填充DropDownList,就不会触发SelectedIndexChanged

用javascript来添宠dropdownlist的话,那么postback后你的dropdownlist是无法保持变化的

建议用其他控件,譬如<input type=hidden>实现,在postback后,把变化放到dropdownlist里
ghchen 2005-10-19
  • 打赏
  • 举报
回复
大虾,你说的方法,确实可行,还有个不明白的地方,就是在页面page_load事件处理程序中绑定datagrid都是可以的,怎么还要等控件page_load执行完才行,由于我是用javascript来填充DropDownList,就不会触发SelectedIndexChanged,哪我应该重写哪个方法比较好,不过怎么用户控件好像没法重写raisepostback或者RaisePostDataChangedEvent事件处理程序,不知我理解有没有对,请大虾多多指教
ghchen 2005-10-18
  • 打赏
  • 举报
回复

[HttpException (0x80004005): 控件不能修改其父级的控件集合。]
System.Web.UI.ControlCollection.RemoveAt(Int32 index)
System.Web.UI.ControlCollection.Clear()
Applegold.VirtualExpo.ClientClass.InitBrandlist() in c:\inetpub\wwwroot\applegold\virtualexpo\clientclass.aspx.cs:104
Applegold.VirtualExpo.ClientClass.Onchange_oc(Object sender, OrderChangeArgs e) in c:\inetpub\wwwroot\applegold\virtualexpo\clientclass.aspx.cs:338
Applegold.VirtualExpo.Modules.OrderCtl.OnOrderChange(OrderChangeArgs e) in c:\inetpub\wwwroot\applegold\virtualexpo\modules\orderctl.ascx.cs:48
Applegold.VirtualExpo.Modules.OrderCtl.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\applegold\virtualexpo\modules\orderctl.ascx.cs:127
System.Web.UI.Control.OnLoad(EventArgs e)
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Control.LoadRecursive()
System.Web.UI.Page.ProcessRequestMain()


ghchen 2005-10-18
  • 打赏
  • 举报
回复
@ saucer
我不是自己调用dgbrand.Controls.Clear();而是dgbrand.databind()函数调用的,不重写的话我都控制不到,所以在高一层来清除不是很可能,而且还要重建,我觉得是我那个被嵌在模板列里的用户控件可能在哪里没有做好,大虾多指点指点
saucer 2005-10-18
  • 打赏
  • 举报
回复
don't raise the event in Page_Load, do it in DropDownList's SelectedIndexChanged, for example

testac.ascx.cx

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

}

#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);
DropDownList1.SelectedIndexChanged += new EventHandler(SelectionChanged);

}
#endregion

private void SelectionChanged(Object sender, EventArgs e)
{
string abc = DropDownList1.SelectedValue;
if (abc=="2121" && flag != string.Empty )
Onchang();

}

webtest.aspx.cs

private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
DataList1.DataSource=buildata(10);
DataList1.DataBind();
}

}


saucer 2005-10-18
  • 打赏
  • 举报
回复
应该是设计如此,我能猜测的是,如果允许的话,就把当前控件也从集合里去除了,当前控件就会变成孤儿控件,有些属性就会无效,譬如ClientID

改变你的编码设计,在高一层次的容器级来清除控件
ghchen 2005-10-18
  • 打赏
  • 举报
回复
我是在datagrid中加了下模块列,里面放了一个用户控件,控件里触发了一个事件后就再绑定就出现这种异常,请大虾指点,是不是这个用户控件要注意什么地方
ghchen 2005-10-18
  • 打赏
  • 举报
回复
用户控件
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="testac.ascx.cs" Inherits="start.testuc" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<asp:DropDownList id="DropDownList1" runat="server" AutoPostBack="True">
<asp:ListItem Value="1212">1212</asp:ListItem>
<asp:ListItem Value="2121">2121</asp:ListItem>
<asp:ListItem Value="21">21</asp:ListItem>
<asp:ListItem Value="2121">2121</asp:ListItem>
</asp:DropDownList>


namespace start
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

/// <summary>
/// test 的摘要说明。
/// </summary>
public class testuc : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.DropDownList DropDownList1;

public event EventHandler change;
public string flag
{
get{
if (ViewState["__flag"]==null)
return string.Empty;
else
return (string)ViewState["__flag"];
}
set
{
ViewState["__flag"] = value;

}

}

protected void Onchang()
{
if (change != null )
change(this,null);

}

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

if (IsPostBack)
{
string abc = Request[DropDownList1.UniqueID];
if (abc=="2121" && flag != string.Empty )
Onchang();
}


}

#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);

}
#endregion
}
}

aspx文件
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace start
{
/// <summary>
/// webtest 的摘要说明。
/// </summary>
public class webtest : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataList DataList1;

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

DataList1.DataSource=buildata(10);
DataList1.DataBind();
}

#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);

}
#endregion

public DataTable buildata(int c)
{
DataTable dt= new DataTable();

DataColumn dc = new DataColumn("a",typeof(int));
dt.Columns.Add(dc);
for(int i=0 ; i< c; i++)
{
DataRow dr = dt.NewRow();
dr["a"] = i;
dt.Rows.Add(dr);
}
return dt;

}

public void aaaaaaa(object o , System.EventArgs e)
{


DataList1.DataSource=buildata(17);
DataList1.DataBind();

}
}
}


<%@ Register TagPrefix="uc1" TagName="testuc" Src="testac.ascx" %>
<%@ Page language="c#" Codebehind="webtest.aspx.cs" AutoEventWireup="false" Inherits="start.webtest" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>webtest</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:DataList id="DataList1" style="Z-INDEX: 101; LEFT: 64px; POSITION: absolute; TOP: 40px" runat="server">
<ItemTemplate>
<uc1:testuc id="Test1" runat="server" flag="10" Onchange="aaaaaaa"></uc1:testuc>
</ItemTemplate>
</asp:DataList>
</form>
</body>
</HTML>

我这是个简化版的,当用户控件的change事件发生时就出异常

saucer 2005-10-18
  • 打赏
  • 举报
回复
show your code or if your code is too complicated, try to create a simpler version, reproduce the problem, then post the code here
ghchen 2005-10-18
  • 打赏
  • 举报
回复
我找了一些资料,由于datagrid的controls集合设置成了只读的,不过不清楚它在什么时候进行设置了,能否修改一下,(其它的控件的事件好像就没有这样设置)请大虾指点,谢谢

62,041

社区成员

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

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

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

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