在插入绑定列时,FindControl不在GridView上工作

时间:2010-11-08 21:10:05

标签: c# asp.net gridview findcontrol

我有一个包含多个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(),所有这些都无法正常工作。

请建议解决方案或解决方法。

提前致谢。

2 个答案:

答案 0 :(得分:1)

听起来你遇到过这个错误:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=104994&wa=wsignin1.0

当将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;
}