Asp.net 控件。在CreateChildControls之后Remove()不起作用?
我正在开发一个SharePoint 2010非可视化Web部件,它在一个大表中显示某种数据。 应通过从作为Web部件一部分的DropDownList中选择筛选标准来筛选表行 DropDownList的OnSelectedIndexChanged事件在CreateChildControls之后和OnPreRender之前激发。由于表的单元格包含附加了OnClick事件的LinkButtons,因此必须在CreateChildControls中创建它们,才能触发OnClick事件 在触发DropDownList的OnSelectedIndexChanged之前,我不知道要隐藏表中的哪些行,因此我在CreateChldControl中创建了所有可能的表行,并尝试稍后在OnSelectedIndexChanged事件中或在OnPreRender中删除过滤后的行。行已从父表的控件集合中物理删除,但它们从未显示 作为一个测试,我尝试在创建CreateChildControls方法后删除一些随机行,结果成功了,这些行没有被渲染 如何删除行:Asp.net 控件。在CreateChildControls之后Remove()不起作用?,asp.net,sharepoint-2010,web-parts,Asp.net,Sharepoint 2010,Web Parts,我正在开发一个SharePoint 2010非可视化Web部件,它在一个大表中显示某种数据。 应通过从作为Web部件一部分的DropDownList中选择筛选标准来筛选表行 DropDownList的OnSelectedIndexChanged事件在CreateChildControls之后和OnPreRender之前激发。由于表的单元格包含附加了OnClick事件的LinkButtons,因此必须在CreateChildControls中创建它们,才能触发OnClick事件 在触发DropDo
Table mt = FindControl("matrixtable") as Table;
Helpers.Log("Controls in Table: " + mt.Controls.Count);
foreach (int kdid in kdIdsInvisible)
{
TableRow c = mt.FindControl("kdrow" + kdid) as TableRow;
Helpers.Log(c.ID);
mt.Controls.Remove(c);
}
Helpers.Log("Controls in Table: " + mt.Controls.Count);
输出:
Controls in Table: 88
Controls in Table: 2
但所有行仍被渲染
有解决办法吗?提前谢谢你 调试:
循环并向屏幕写入表中所有行的所有ID
然后再次循环,并将删除的所有行ID写入屏幕
找到未删除的两行,看看它们是否有ID。可能有拆分表单元格或其他内容
在最坏的情况下,在VisualStudio中调试WP,观察一行一行地删除,并观察表的计数,以查看跳过了哪些行。尝试删除即时窗口中的这些行,看看会出现什么错误。我认为需要从表行集合中删除该行。尝试更换线路
mt.Controls.移除(c)代码>带mt.Rows.Remove(c)代码>
下面是删除SelectedIndexChanged事件中的行的工作示例
[ToolboxItemAttribute(false)]
public class TableTest : WebPart
{
protected override void CreateChildControls()
{
// Build a table
Table t = new Table();
t.ID = "table";
for (int i = 0; i < 11; i++)
{
TableRow tr = new TableRow();
t.Rows.Add(tr);
for (int j = 0; j < 5; j++)
{
TableCell tc = new TableCell();
tc.Controls.Add(new LiteralControl("Row " + i + " Cell " + j));
tr.Cells.Add(tc);
}
}
// Add a dropdown
DropDownList dl = new DropDownList();
dl.AutoPostBack = true;
dl.Items.Add(new ListItem { Text = "Odd", Value = "1" });
dl.Items.Add(new ListItem { Text = "Even", Value = "2" });
dl.SelectedIndexChanged += dl_SelectedIndexChanged;
// Add to the controls collection
Controls.Add(dl);
Controls.Add(t);
}
void dl_SelectedIndexChanged(object sender, EventArgs e)
{
// Get the table and dropdown
Table t = FindControl("table") as Table;
DropDownList dl = sender as DropDownList;
if (t != null && dl != null)
{
int i = 1;
// Set up a list to hold the rows to remove
IList<TableRow> removeRows = new List<TableRow>();
if (dl.SelectedValue == "1") // Get all odd rows
{
foreach (TableRow tr in t.Rows)
{
if (i % 2 == 0)
{
removeRows.Add(tr); // Add odd rows to the list of rows to remove
}
i++;
}
}
else // Get all even rows
{
foreach (TableRow tr in t.Rows)
{
if (i % 2 == 1)
{
removeRows.Add(tr); // Add even rows to the list of rows to remove
}
i++;
}
}
foreach (var tr in removeRows)
{
t.Rows.Remove(tr); // Remove the rows from the table
}
}
}
}
[ToolboxItemAttribute(false)]
公共类TableTest:WebPart
{
受保护的覆盖无效CreateChildControls()
{
//建一张桌子
表t=新表();
t、 ID=“表格”;
对于(int i=0;i<11;i++)
{
TableRow tr=新的TableRow();
t、 行。添加(tr);
对于(int j=0;j<5;j++)
{
TableCell tc=新的TableCell();
添加(新的文字控件(“行”+i+“单元格”+j));
tr.Cells.Add(tc);
}
}
//添加下拉列表
DropDownList dl=新的DropDownList();
dl.AutoPostBack=true;
添加(新列表项{Text=“Odd”,Value=“1”});
添加(新列表项{Text=“偶数”,Value=“2”});
dl.SelectedIndexChanged+=dl_SelectedIndexChanged;
//添加到控件集合
添加(dl);
对照组:添加(t);
}
void dl\u SelectedIndexChanged(对象发送方,事件参数e)
{
//把桌子拿下来
表t=FindControl(“表”)作为表;
DropDownList dl=发送方作为DropDownList;
如果(t!=null&&dl!=null)
{
int i=1;
//设置一个列表以保存要删除的行
IList removeRows=新列表();
if(dl.SelectedValue==“1”)//获取所有奇数行
{
foreach(表行tr,t行)
{
如果(i%2==0)
{
removows.Add(tr);//将奇数行添加到要删除的行列表中
}
i++;
}
}
else//获取所有偶数行
{
foreach(表行tr,t行)
{
如果(i%2==1)
{
removows.Add(tr);//将偶数行添加到要删除的行列表中
}
i++;
}
}
foreach(在操作系统中的var tr)
{
t、 Rows.Remove(tr);//从表中删除行
}
}
}
}
您确定在删除控件后没有进行数据绑定吗?尝试在预渲染时删除。我尝试先删除OnPreRender中的控件。它不起作用。控件已被删除,(我检查了),但它们仍被渲染。删除控件仅在CreateChildControls中有效,但此时我不知道要删除哪个。在OnPreRender中我会知道的。鸡还是蛋的两难选择。不要在CreateChildControls上添加表,而是将项目添加到单独的列表中。然后在OnPreRender中添加,您知道要添加哪些。只是一个变通办法。您的代码似乎有其他问题,如果不在init或load上添加动态控件,您将在处理回发事件时遇到问题。也许您可以将列表存储在viewstate中,以便在那里进行正确的渲染。也尝试过这样做。如果我将它们添加到OnPreRender中,则事件不会在回发时抛出。我怀疑这些控件必须添加到创建子控件中,因为事件方法是在CreateChildControls和OnPreRender之间执行的。