2017-02-13 6 views
1

У меня проблема с управлением репитером asp.Управление репитером Asp

У меня есть таблица в моей базе данных, называемая курсом с колонками CourseID, CourseName, CourseLink и другой таблицей с модулем с столбцами ModuleID, ModuleName. И еще одна таблица называется расписанием с колонками CourseID и ModuleID.

Способ, которым это работает, когда я нажимаю на HyperLink1, абзац ниже с тем же идентификатором курса, это изменит отображение стиля абзаца из скрытого, чтобы показать (я использовал JavaScript для выполнения этой функции, так что здесь не проблема).

Что я хотел бы знать, как я могу перечислить имена модулей, которые относятся к этому идентификатору курса.

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

Как я могу заставить это работать, не работайте над sql, потому что мне удобно создавать команду select.

Это форум ASP.NET.

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSource1"> 
    <ItemTemplate> 
     <p> 
      <a id="HyperLink1" runat="server" href='<%# Eval("courselink") %>'> 
       <%# Eval("CourseName") %> 
      </a> <br /> 
     </p> 

     <p id='<%# Eval("CourseID") %>' style="display:none"> 
      <%# Eval("ModulName") %> 
     </p> 
     <br /> 

    </ItemTemplate> 
</asp:Repeater> 

Спасибо за ваше время, и я с нетерпением жду, чтобы узнать, что я могу сделать, чтобы решить эту проблему.

+0

I предложите использовать сильно типизированные модели, получить их в своем коде и привязать их к вашему ретранслятору. Затем используйте вложенные ретрансляторы. – mason

+0

Привет @mason Я пробовал это в начале, но у меня всегда были проблемы с получением идентификаторов из репитера, путем вложения повторителей, это стало бы еще более сложным, поэтому я попытался найти другие варианты, но похоже, что это единственный способ , Могу ли я попросить вас подробнее рассказать о своих объяснениях. Спасибо – mSrsF

+0

[вложенные повторители] (http://stackoverflow.com/questions/17398312/nested-repeaters-in-c-sharp) обсуждались ранее. – mason

ответ

1

Вам понадобится использовать другой ретранслятор, трюк (если я правильно помню, что я не использовал устаревшие веб-формы ASP.NET с 2011 года) заключается в том, что вы подключаетесь к событию ItemDataBound в вашем коде для родительский ретранслятор, а затем использовать аргументы событий, чтобы получить идентификатор, который вы связываете с вашей дочерней таблицей, получить эти данные, найти ретранслятор по идентификатору из Repeater (I думаю, это отправитель, но есть какой-то способ добраться до него) и привязать данные.

Я хочу отметить, что это намного проще и чище с ASP.NET MVC, и использование веб-форм ASP.NET обычно обескуражено.

+0

Привет, Джейсон, Спасибо за ваш ответ. можно было бы объяснить это дальше, например, если возможно, пожалуйста. Спасибо. – mSrsF

1

Это может быть худшим таким образом

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSource1"> 
<ItemTemplate> 
    <p> 
     <a id="HyperLink1" runat="server" href='<%# Eval("courselink") %>'> 
      <%# Eval("CourseName") %> 
     </a> <br /> 
    </p> 

    <p id='<%# Eval("CourseID") %>' style="display:none"> 
     <%# moduleName(Eval("id").ToString()) %> 
    </p> 
    <br /> 

</ItemTemplate> 

public string moduleName(string id) 
{ 
    string returnValue = "<ul>"; 
    using (SqlConnection con = new SqlConnection(DB)) 
    { 
     using (SqlCommand com = new SqlCommand("SELECT * FROM module WHERE id = @id", con)) 
     { 
      com.Parameters.AddWithValue("@id", id); 
      if (con.State == System.Data.ConnectionState.Closed) 
      { 
       con.Open(); 
       using (SqlDataReader dr = com.ExecuteReader()) 
       { 
        while (dr.Read()) 
        {        
         returnValue += "<li>"+ dr["modulename"].ToString()+"</li>"; 
        } 
       } 
       con.Close(); 
      } 
     } 
    } 
    returnValue += "</ul>"; 
    return returnValue; 
} 
+0

Привет, уважаемый, Спасибо за ваш ответ. Однако я хочу извлечь идентификатор модуля из расписания, где идентификатор курса совпадает с идентификатором абзаца в веб-форме. – mSrsF

+0

моя строка выбора выглядит примерно так: «DataSource1.SelectCommand =» Выберите MODULE.MODULENAME, course.courseid, course.courseName, course.courselink Из MODULE, COURSE, TIMETABLE, где COURSE.COURSEID = TIMETABLE.COURSEID и MODULE.MODULEID = РАСПИСАНИЕ .MODULEID и COURSE.COURSEID = "+ courseID'. Идентификатор курса в конце - это то, что я хочу вызвать, и пусть он отобразит все идентификаторы модулей с этим идентификатором курса в расписании – mSrsF

1

Наилучшим решением было бы создать строго типизированный модель для презентации и не используйте Eval, вы получите что-то как это в вашем веб-форму:

<asp:Repeater runat="server" DataSourceID="<%# Model %>"> 
    <ItemTemplate> 
     <p> 
      <a href="<%# ((Course)Container.DataItem).Link %>"><%# ((Course)Container.DataItem).Name %></a> 
     </p> 

     <p id='<%# ((Course)Container.DataItem).ID %>' style="display:none"> 
      <asp:Repeater runat="server" DataSource="<%# ((Course)Container.DataItem).Modules %>"> 
       <HeaderTemplate> 
        <ul> 
       </HeaderTemplate> 
        <ItemTemplate> 
         <li><%# ((Module)Container.DataItem).Name %></li> 
        </ItemTemplate> 
       <FooterTemplate> 
        </ul> 
       </FooterTemplate> 
      </asp:Repeater> 
     </p> 
</ItemTemplate> 

Затем в коде позади создать следующее свойство:

public List<Course> Model 
{ 
    get 
    { 
     List<Course> courses = new List<Course>(); 
     // Some example data, in your situation you should instantiate the classes based on the data from the database. 
     Course exampleCourse = new Course(); 
     exampleCourse.ID = 1; 
     exampleCourse.Name = "Example course"; 

     // Create example module 1 
     Module exampleModule1 = new Module(); 
     exampleModule1.ID = 10; 
     exampleModule1.Name = "Example Module 1"; 

     // Create example module 2 
     Module exampleModule2 = new Module(); 
     exampleModule2.ID = 11; 
     exampleModule2.Name = "Example Module 2"; 

     // add modules to the course 
     exampleCourse.Modules.Add(exampleModule1); 
     exampleCourse.Modules.Add(exampleModule2); 

     // add course to the courses 
     courses.Add(exampleCourse); 
     return courses; 
    } 
} 

Классов, необходимые:

public class Course 
{ 
    public int ID { get; set; } 
    public string Link { get; set; } 
    public string Name { get; set; } 
    public List<Module> Modules { get; set; } 
    public Course() 
    { 
     this.Modules = new List<Module>(); 
    } 
} 

public class Module 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

Последние, в вашей загрузке страницы, не забудьте привязку:

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.DataBind(); 
} 
+0

Спасибо, Кеннет, это именно то, что я ищу. Однако я не уверен, что положить бит todo, было бы возможно, если бы вы могли объяснить это дальше? – mSrsF