2017-04-21 32 views
0

我基于可能的模块选择显示学生的时间表工作。每次选中一个复选框时,我都希望通过选择的“ModuleId”值来在SELECT查询中使用,以显示所选模块的时间表。因此,如果用户选择3个复选框,则每个选中行的'ModuleId'将被传递到SELECT查询中。ASP.NET传递多个复选框值到一个SELECT查询

我不知道如何来存储每个选择“的moduleId”并将其添加到我的选择查询。

下面是我如何检索检查值:

<asp:TemplateField> 
    <ItemStyle HorizontalAlign="Center" Width="40px"></ItemStyle> 
      <ItemTemplate> 
      <asp:CheckBox ID="chkRow" runat="server" ToolTip='<%# Eval("ModuleId") %>' OnCheckedChanged="module_Changed" /> 
     </ItemTemplate> 
<asp:TemplateField> 

下面是我的方法来显示(只是为了测试目的)在标签值:

 protected void module_Changed(object sender, EventArgs e) 
     { 
     // Retrieve the check box ModuleId value to add to my SELECT query 
     string moduleid = ((CheckBox)sender).ToolTip; 
    } 

下面是我的方法,包含选择查询以显示时间表:

public String[] getModulesAtCurrentSlot(int timeslotInt, String moduleID, String Day) 
     { 
      List<String> modulesList = new List<string>(); 
      if (conn.State.ToString() == "Closed") 
      { 
       conn.Open(); 
      } 
      SqlCommand newCmd = conn.CreateCommand(); 
      newCmd.Connection = conn; 
      newCmd.CommandType = CommandType.Text; 
      newCmd.CommandText = "SELECT DISTINCT Module.ModuleCode,ClassType.ClassTypeName,Convert(time,Class.StartTime), Convert(time,Class.EndTime),Building.BuildingName,RoomCode.RoomCode,Class.Color" + 
        " FROM Class INNER JOIN Module ON Class.ModuleId = Module.ModuleId INNER JOIN RoomCode ON Class.RoomCodeId = RoomCode.RoomcodeId INNER JOIN Building ON RoomCode.BuildingId = Building.BuildingId INNER JOIN Days ON Class.DayId = Days.DayID INNER JOIN ClassType ON Class.ClassTypeId = ClassType.ClassTypeId WHERE " + 
        " Module.ModuleId = " + moduleID + " AND Convert(Date,StartTime) = '" + Day + "' AND " + timeslotInt.ToString() + " BETWEEN ClassScheduleStartTimeId and ClassScheduleEndTimeId"; 
      SqlDataReader dr = newCmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       String current = "<div class='slot' " + (!dr.IsDBNull(6) ? "style=\"background-color: " + dr.GetString(6) + ";\"" : "") + ">"; 
       current += "<div class='line1'>" + dr.GetString(0) + "&nbsp;" + dr.GetString(1) + "</div>";// +"<br />"; 
       current += "<div class='line2'>" + dr.GetTimeSpan(2).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + "&nbsp;-&nbsp;" + dr.GetTimeSpan(3).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + "</div>";// +"<br />"; 
       current += "<div class='line3'>" + dr.GetString(4) + "&nbsp;" + dr.GetString(5) + "</div>"; 
       current += "</div>"; 
       modulesList.Add(current); 
      } 
      conn.Close(); 
      return modulesList.ToArray(); 
     } 

在前一页其中th e时间表仅显示一个ModuleId的数据我已使用下面的查询字符串来传递值。

String module_ID = "2"; 
     if (Request.QueryString["module"] != null) 
     { 
      module_ID = Request.QueryString["module"]; 
     } 
     else 
     { 
      Response.Write("Missing ?module=XX from url :("); 
      Response.End();// EndRequest; 
     } 

DBAccess.cs截图: DBAccess.cs screenshot

错误截图: Errors screenshot

回答

1

如果我理解正确的话,你可以有一个包含字符串列表持有所有选定的会话变量的moduleId的

然后,您可以使用module_Changed事件中添加或从列表中删除moduleIDs,然后调用getModulesAtCurrentSlot为列表中的每个moduleid循环,并将返回的字符串[] s连接成一个更长的字符串[]或List,然后显示。

有可能在代码一些错误下面是我只是在做它的内存,但它应该给你一个想法!

protected void module_Changed(object sender, EventArgs e) 
{ 
    List<string> lst; 
    if(Session["lst"]!=null) 
     lst = (List<string>)Session["lst"]; 
    else 
      Session.Add("lst", new List<string>()); 


    // Retrieve the check box ModuleId value to add to my SELECT query 
    string moduleid = ((CheckBox)sender).ToolTip; 

    // add your own code to check if checkbox is checked or unchecked to see if you need to add or remove the ID from the list 

    // to add 
    if(lst.Contains(moduleid) == false) 
     lst.Add(moduleid); 

    // to remove - add your own code 

    List<string> lstResult = new List<string>(); 
    foreach(var moduleID in lst) 
    { 
     lstResult.Add(getModulesAtCurrentSlot(timeslotInt, moduleID, Day)); 
    } 

    // do something to display lstResult 
    // e.g. drag a Gridview control on your aspx page and bind the results list to it - this is just to give you a rough idea but you'll need to play around with it to get it to work as you want, and hopefully learn something in the process ;) 
    Gridview1.DataSource = lstResult; 
    Gridview1.Databind(); 

} 
+0

非常感谢你提供上面的代码。我阅读了您的评论和代码,我认为使用会话来传递包含所有ModuleId的字符串是一个聪明的想法。我对c#编程颇为陌生,所以我不完全确定如何通过选择的所有ModuleId作为会话。我从上一页添加了上面的代码。 – dcraven

+1

没有问题,请确保您回来保存更新列表到会话太否则你会失去它 – Damo

+0

我试图在实现这个代码,但它抛出一个错误有以下几点:Session.Add(新名单)) ; 。我明白你现在要做的是什么。我只是不知道所有的ModuleId被选中是如何通过列表的。我让你使用foreach循环,但是所有选中的ModuleId都需要一次显示在时间表中。 getModulesAtCurrentSlot只会用一个值替换ModuleId。请指教:) – dcraven