Глубина обработки встроенных повторителей - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть вопрос дизайна. У меня есть вложенная структура повторителя, которая имеет 4 яруса. Повторители отображают данные, которые рассматриваются как «Разделы 1-4». Все эти разделы в базе данных связаны с описанием задания.

Я хочу добавить кнопку редактирования для каждого элемента самого глубокого уровня ретрансляторов. Однако, глубина репитера не все эквивалентны. Описание работы может иметь несколько записей для каждого раздела (1-4), поэтому необходимы повторители. Однако, как указывалось ранее, подвох состоит в том, что данная запись секций может быть 1-3 ... затем 1-4 ... может быть, даже просто первая секция.

Еще одним предварительным условием, которое делает это сложным, является то, что он был разработан для привязки только к одному уровню за раз. Затем они нажимают кнопку перехода вниз по img, которая связывает следующий набор данных с внутренним ретранслятором. Так что это делает это более сложным, чем просто подсчет количества раз, когда вы привязываетесь к нему.

Итак, мой вопрос в том, какую программную конструкцию я мог бы использовать, чтобы относительно быстро определить глубину данной записи? Очевидно, что решение, которое не требовало бы дополнительного времени, было бы удивительным, учитывая, что у меня есть срок выполнения.

Вот структура таблицы. Имейте в виду, что это не изменчиво. Это было раньше времени.

 Table       FK         PK
Section1 |  JobID   | Sect1ID |
Section2 |  Sect1ID | Sect2ID |
Section3 |  Sect2ID | Sect3ID |
Section4 |  Sect3ID | Sect4ID |

Структура повторителя

<Repeater 1>
     <Section 1 Data>
     <Repeater 2>
          <Section 2 Data>          
          <Repeater 3>
               <Section 3 Data> 
               <Repeater 4>
                    <Section 4 Data>
               </Repeater>
           </Repeater>
      </Repeater>
 </Repeater>

Некоторые из моих идей.

Создать хранимую процедуру, которая вычисляет глубину записи. Передайте в SectID, и он возвращает глубину относительно SectID. У меня уже есть структура, позволяющая идентифицировать каждый отдельный элемент ретранслятора по идентификатору раздела через скрытую метку asp: *. 1019 *

Ведение словаря для отображения раздела по его глубине. Используйте хранимую процедуру. Тем не менее, только запись, когда предмет сверлится. Таким образом, он легкий, и я отслеживаю только те элементы, которые интересуют пользователя.

Каждый раз, когда пользователь выполняет детализацию, выполняйте проверку, чтобы увидеть, равны ли глубины ... если они есть, то отобразите кнопку редактирования img, если нет, то просверлите и увеличьте значение в словаре.

какие-либо другие идеи или проблемы, которые они предвидят с моим решением?

1 Ответ

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

Ответ был на самом деле довольно прямым. Выполнение всего этого отслеживания было в лучшем случае неуклюжим подходом. Решение гораздо проще, чем это. Я не самый опытный автор хранимых процедур, так что терпите меня в этом вопросе. Если кто-то склонен показывать более удобную и аккуратную версию, это было бы здорово!

Решение состоит в том, чтобы создать набор хранимых процедур, которые просматривают следующую запись раздела, связанную с ним

bit doesSection2RecordExist(int prevSectID)
bit doesSection3RecordExist(int prevSectID)
bit doesSection4RecordExist(int prevSectID)

все они возвращают немного, т. Е. Верно или неверно в отношении утверждения, подразумеваемого именем SP

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

    public enum SectionType { First, Second, Third, Fourth };

    public static bool HasNextSection(int prevSectID, SectionType sectNum)
    {
        if (sectNum > SectionType.First)
        {
            var procName = "Section" + (int)sectNum + "RecordExists";
            using (var ov = new OneValue(Product.SafetyObs, procName))
            {
                ov["PrevSectID"] = prevSectID;
                return ov.Value.Bool;
            }
        }
        return false;
    }

Последний шаг - сделать вызов в подходящее время, чтобы проверить, есть ли еще одна запись на более глубоком уровне. Это делается в событии OnBound повторителя

Еще одно замечание: я сделал получение правильного предыдущего идентификатора раздела более простым. Я храню его на каждом уровне яруса в Label во время привязки и делаю его невидимым.

protected void rptrSection1_Bound(object sender, RepeaterItemEventArgs e)
    {                        
        var lblID = e.Item.FindControl("lblSection1Id") as Label;
        var sectID = int.Parse(lblID.Text);

        if (!SectionLoader.HasNextSection(sectID, SectionType.Second))
        {
            //things to do if there are no sections left
        }
        else
        {
            //things to do if there are sections left
        }

        return;
    }

а потом я просто повторяю это со всеми внутренними повторителями 2-4

Надеюсь, это поможет любому, кто столкнется с чем-то подобным в будущем !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...