2010-11-19 7 views
0

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

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

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

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

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

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

Repeater Структура

<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:.

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

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

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

ответ

0

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

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

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

все они возвращают немного т.е. Истина или Ложь о заявлении подразумеваемой имени С.П.

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

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 ретранслятора

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

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

Я надеюсь, что это помогает для тех, кто работает в нечто подобное в будущем !!

Смежные вопросы