Arhn - архитектура программирования

Controls.Remove () не работает после CreateChildControls?

Я разрабатываю невизуальную веб-часть SharePoint 2010, которая отображает какие-то данные в большой таблице. Строки таблицы должны быть отфильтрованы путем выбора критерия фильтрации из DropDownList, который является частью веб-части.

Событие OnSelectedIndexChanged в DropDownList запускается после CreateChildControls и перед OnPreRender. Поскольку ячейки таблицы содержат LinkButtons с присоединенным событием OnClick, они должны быть созданы в CreateChildControls, чтобы запускались события OnClick.

Я не знаю, какие строки таблицы нужно скрыть, пока не будет запущен OnSelectedIndexChanged в DropDownList, поэтому я создаю все возможные строки таблицы в CreateChldControls и пытаюсь удалить отфильтрованные позже в 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

Но все строки по-прежнему отображаются ...

Есть ли решение для этого? Заранее спасибо!


  • Вы уверены, что не выполняете привязку данных после удаления элементов управления? Попробуйте удалить на PreRender. 29.07.2013
  • Сначала я попытался удалить элементы управления в OnPreRender. Это не работает. Элементы управления были удалены (я это проверил), но они все равно отображаются. Удаление элементов управления работало только в CreateChildControls, но в настоящее время я не знаю, какие из них удалить. Я бы знал это в OnPreRender. Дилемма курицы или яйца. 29.07.2013
  • Вместо добавления таблицы в CreateChildControls добавьте элементы в отдельный список. Затем добавьте в OnPreRender, где вы знаете, какие добавить. Просто обходной путь. Он видит, что с вашим кодом что-то еще не так, и у вас возникнут проблемы с обработкой события обратной передачи, если вы не добавите динамические элементы управления при инициализации или загрузке. Возможно, вы можете сохранить список в своем состоянии просмотра, чтобы выполнить там правильный рендеринг. 29.07.2013
  • Тоже пробовал. Если я добавлю их в OnPreRender, события не будут выбраны при обратной передаче. Я подозреваю, что элементы управления должны быть добавлены в создание дочерних элементов управления, потому что методы событий выполняются между CreateChildControls и OnPreRender. 29.07.2013
  • Чтобы ответить на ваш первый вопрос: я вообще не использую привязку данных. 29.07.2013

Ответы:


1

Отладка:

Прокрутите и запишите на экран все идентификаторы всех строк таблицы.

Затем выполните цикл еще раз и запишите на экран все идентификаторы строк, которые были удалены.

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

В худшем случае выполните отладку WP в Visual Studio и посмотрите, как строки удаляются одну за другой, и посмотрите количество таблиц, чтобы увидеть, какие из них пропускаются. Попробуйте удалить эти строки для немедленного окна и посмотрите, какую ошибку вы получите.

30.07.2013

2

Я думаю, вам нужно удалить строку из коллекции строк таблицы. Попробуйте заменить строку mt.Controls.Remove(c); на mt.Rows.Remove(c);

Вот рабочий пример удаления строк в SelectedIndexChanged event

[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
            }
        }
    }
} 
31.07.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..