FindControl не работает на GridView при вставке связанных столбцов - PullRequest
1 голос
/ 09 ноября 2010

У меня есть сетка с несколькими ItemTemplates. Первый содержит флажок, остальные содержат текстовые поля.

Затем я динамически добавил несколько связанных элементов управления, таких как:

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");
}

и т.д.

Это все работало нормально. Затем я получил запрос на размещение связанных полей во втором, третьем и четвертом столбцах после флажка и перед текстовыми полями. Я обнаружил, что это легко сделать, изменив надстройки на вставки следующим образом:

grdExisting.Columns.Insert(1, bdfPrivName);
grdExisting.Columns.Insert(2, bdfDescription);
grdExisting.Columns.Insert(3, bdfLive);

Все выглядело нормально, но FindControl () все они не работают.

Пожалуйста, предложите решение или обходной путь.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Похоже, вы столкнулись с этой ошибкой:

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

Похоже, ViewState не сохраняется (или восстанавливается), когда BoundField вставляется в GridView.Поэтому, когда вы выполняете FindControl, его не существует.

Вы можете попробовать добавить их, как делали раньше, и найти какой-то способ перестановки столбцов (я думаю, что это возможно).

0 голосов
/ 09 ноября 2010

Я не уверен, как это работало для вас раньше, поскольку элементы управления не принадлежат ряду - они находятся внутри ячеек. В любом случае, проблема в том, что 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;
}
...