Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 控件。在CreateChildControls之后Remove()不起作用?_Asp.net_Sharepoint 2010_Web Parts - Fatal编程技术网

Asp.net 控件。在CreateChildControls之后Remove()不起作用?

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

我正在开发一个SharePoint 2010非可视化Web部件,它在一个大表中显示某种数据。 应通过从作为Web部件一部分的DropDownList中选择筛选标准来筛选表行

DropDownList的OnSelectedIndexChanged事件在CreateChildControls之后和OnPreRender之前激发。由于表的单元格包含附加了OnClick事件的LinkButtons,因此必须在CreateChildControls中创建它们,才能触发OnClick事件

在触发DropDownList的OnSelectedIndexChanged之前,我不知道要隐藏表中的哪些行,因此我在CreateChldControl中创建了所有可能的表行,并尝试稍后在OnSelectedIndexChanged事件中或在OnPreRender中删除过滤后的行。行已从父表的控件集合中物理删除,但它们从未显示

作为一个测试,我尝试在创建CreateChildControls方法后删除一些随机行,结果成功了,这些行没有被渲染

如何删除行:

  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之间执行的。