我有一个包含多个ItemTemplates的gridview。第一个包含一个复选框,其余包含文本框。
然后我动态添加了一些这样的绑定控件:
BoundField bdfPrivName = new BoundField();
clsUtilities.SetBoundFieldCenter(ref bdfPrivName, "PrivName", "Priv Name");
BoundField bdfDescription = new BoundField();
clsUtilities.SetBoundFieldLeft(ref bdfDescription, "PrivDesc", "Description");
BoundField bdfLive = new BoundField();
clsUtilities.SetBoundFieldCenter(ref bdfLive, "Live","Active?");
grdExisting.Columns.Add(bdfPrivName);
grdExisting.Columns.Add(bdfDescription);
grdExisting.Columns.Add(bdfLive);
然后我使用FindControl()来找到复选框和文本框,并根据结果执行我的逻辑
foreach (GridViewRow gvr in grdMissing.Rows)
{
mckbAny = (CheckBox)gvr.FindControl("ckbAdd");
mtxtApplyDate = (TextBox)gvr.FindControl("txtAddApplyDate");
mtxtDateToAdd = (TextBox)gvr.FindControl("txtAddDateToAdd");
mtxtDateToRemove = (TextBox)gvr.FindControl("txtAddDateToRemove");
}
等
这一切都很好。然后我收到一个请求,将绑定字段作为第二,第三和第四列,在复选框之后和文本框之前。我发现通过将Add添加到Inserts可以很容易地做到这一点,如下所示:
grdExisting.Columns.Insert(1, bdfPrivName);
grdExisting.Columns.Insert(2, bdfDescription);
grdExisting.Columns.Insert(3, bdfLive);
页面看起来很好,但FindControl(),所有这些都无法正常工作。
请建议解决方案或解决方法。
提前致谢。
答案 0 :(得分:1)
听起来你遇到过这个错误:
当将BoundField插入GridView时,似乎不存储(或恢复)ViewState。因此,当您执行FindControl时,它不存在。
您可以像以前一样尝试添加它们,并找到一些重新排列列的方法(我认为这是可能的)。
答案 1 :(得分:-1)
我不确定它之前是如何起作用的,因为控件不属于行 - 它们位于单元格内。无论如何,问题是FindControl不是递归的,它不会搜索整个控制树 - 只有控件的直接子项才能运行它。您需要实现自己的递归findcontrol,例如:
public static Control FindControlRecursive(Control Root, string Id)
{
if (Root.ID == Id)
return Root;
foreach (Control c in Root.Controls)
{
Control fc = FindControlRecursive(c, Id);
if (fc != null)
return fc;
}
return null;
}