我基于可能的模块选择显示学生的时间表工作。每次选中一个复选框时,我都希望通过选择的“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) + " " + dr.GetString(1) + "</div>";// +"<br />";
current += "<div class='line2'>" + dr.GetTimeSpan(2).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + " - " + dr.GetTimeSpan(3).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + "</div>";// +"<br />";
current += "<div class='line3'>" + dr.GetString(4) + " " + 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;
}
非常感谢你提供上面的代码。我阅读了您的评论和代码,我认为使用会话来传递包含所有ModuleId的字符串是一个聪明的想法。我对c#编程颇为陌生,所以我不完全确定如何通过选择的所有ModuleId作为会话。我从上一页添加了上面的代码。 – dcraven
没有问题,请确保您回来保存更新列表到会话太否则你会失去它 – Damo
我试图在实现这个代码,但它抛出一个错误有以下几点:Session.Add(新名单)) ; 。我明白你现在要做的是什么。我只是不知道所有的ModuleId被选中是如何通过列表的。我让你使用foreach循环,但是所有选中的ModuleId都需要一次显示在时间表中。 getModulesAtCurrentSlot只会用一个值替换ModuleId。请指教:) –
dcraven