asp.net中关于嵌套的一个问题

本文介绍了一个ASP.NET应用程序中使用DataList控件结合CheckBox和CheckBoxList实现动态数据绑定的例子。该示例展示了如何根据年级变化自动勾选相关课程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题是这样的,就是在一个列表控件中有一个CheckBOX,一个CheckList。CheckBox里显示的是年级,而CheckList中显示是根据不同年级开设的课目。
这里列表控件可以采用任意,我用的是DataList.
下面是代码:
前台:
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="HEasySchoolWebSmS.Admin.WebForm2" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title></title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <div>
  10.     
  11.     </div>
  12.     <asp:DataList ID="DataList1" runat="server" onitemdatabound="DataList1_ItemDataBound1">
  13.     <ItemTemplate>
  14.     <tr>
  15.              <td>
  16.               <asp:CheckBox oncheckedchanged="cbP_CheckedChanged" Text=<%# Eval("Class")%>  ID="cbP" runat="server" 
  17.                      AutoPostBack="True" />
  18.              
  19.                <asp:CheckBoxList runat="server" ID="cbl"></asp:CheckBoxList>
  20.                </td></tr>
  21.     </ItemTemplate>
  22.     </asp:DataList>
  23.     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
  24.     </form>
  25. </body>
  26. </html>


后台
  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.Security;
  8. using System.Web.UI;
  9. using System.Web.UI.HtmlControls;
  10. using System.Web.UI.WebControls;
  11. using System.Web.UI.WebControls.WebParts;
  12. using System.Xml.Linq;
  13. using System.Xml;
  14. using System.IO;
  15. using Webb.WAVE.Controls.Upload;
  16. using System.Collections.Generic;
  17. using CL.NET.UI.WebControls;
  18. namespace HEasySchoolWebSmS.Admin
  19. {
  20.     public partial class WebForm2 : System.Web.UI.Page
  21.     {
  22.         //===================================== 初始化AspxBase PowerBest组件 ==========================================
  23.         AspxBase.PowerBest.SystemBaseClass SystemBaseClass = new AspxBase.PowerBest.SystemBaseClass();
  24.         AspxBase.PowerBest.SystemADOClass SystemADOClass = new AspxBase.PowerBest.SystemADOClass();
  25.         AspxBase.PowerBest.SystemIOClass SystemIOClass = new AspxBase.PowerBest.SystemIOClass();
  26.         protected void Page_Load(object sender, EventArgs e)
  27.         {
  28.             if (!Page.IsPostBack)
  29.             {
  30.                 //getParentRe();
  31.                 this.DataList1.DataSource = getParentReCheck(5);
  32.                 this.DataList1.DataBind();
  33.             }
  34.         }
  35.         
  36.         //根据传进来的数值,来判断这里要显示几个年级,因为中国的小学与初中是分五,六年制和三,四年制的。万恶的教育体制
  37.         public DataTable getParentReCheck(int num)
  38.         {
  39.             DataTable dt = new DataTable();
  40.             DataColumn dc = new DataColumn();
  41.             dc.ColumnName = "Class";
  42.             dt.Columns.Add(dc);
  43.             for (int i = 0; i < 6; i++)
  44.             {
  45.                 DataRow dr = dt.NewRow();
  46.                 dr["Class"] = (i + 1).ToString() + "年级";
  47.                 dt.Rows.Add(dr);
  48.             }
  49.             return dt;
  50.         }
  51.         //此处主要是用来做测试用的,如果你不想连接数据库,在下面DataList1_ItemDataBound1方面中,调用它给值就行了。
  52.         public DataTable getChildRe()
  53.         {
  54.             DataTable dt = new DataTable();
  55.             DataColumn dc = new DataColumn();
  56.             dc.ColumnName = "GSubjectname";
  57.             dt.Columns.Add(dc);
  58.             for (int i = 0; i < 6; i++)
  59.             {
  60.                 DataRow dr = dt.NewRow();
  61.                 dr["GSubjectname"] = (i + 1).ToString() + "科目";
  62.                 dt.Rows.Add(dr);
  63.             }
  64.             return dt;
  65.         }
  66.         
  67.         //如果选择年级前面的单选框,哪么,它下面的科目复选框就得被选中 
  68.         protected void cbP_CheckedChanged(object sender, EventArgs e)
  69.         {
  70.             for (int j = 0; j < this.DataList1.Items.Count; j++)
  71.             {
  72.                 CheckBox CB = (CheckBox)this.DataList1.Items[j].FindControl("cbP");
  73.                 if (CB.Checked == true)
  74.                 {
  75.                     CheckBoxList CBL1 = (CheckBoxList)this.DataList1.Items[j].FindControl("cbl");
  76.                     for (int i = 0; i < CBL1.Items.Count; i++)
  77.                     {
  78.                         CBL1.Items[i].Selected = true;
  79.                     }
  80.                 }
  81.                 else
  82.                 {
  83.                     CheckBoxList CBL1 = (CheckBoxList)this.DataList1.Items[j].FindControl("cbl");
  84.                     for (int i = 0; i < CBL1.Items.Count; i++)
  85.                     {
  86.                         CBL1.Items[i].Selected = false;
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.         protected void DataList1_ItemDataBound1(object sender, DataListItemEventArgs e)
  92.         {
  93.            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  94.             {
  95.                 CheckBoxList MyCbl = (CheckBoxList)e.Item.FindControl("cbl");
  96.                 //CheckBox myCB = (CheckBox)e.Item.FindControl("cbP");
  97.                 if (MyCbl != null)
  98.                 {
  99.                     //这里的代码,是一段我做测试的你也可以用
  100.                     //myCbl.DataSource = getChildRe();来绑定
  101.                     string strsql = "SELECT distinct GSubjectname from metaGradeSubjectRelationView where gradetypeid='1' and Gradeid='1'";
  102.                     DataTable dt = DataBaseClass.ExecuteDataSetReader(DataBaseClass.DataBaseConnResourceView, System.Data.CommandType.Text, strsql).Tables[0];
  103.                     MyCbl.DataSource = dt;
  104.                     MyCbl.DataTextField = "GSubjectname";
  105.                     MyCbl.DataValueField = "GSubjectname";
  106.                     MyCbl.DataBind();
  107.                 }
  108.             }
  109.         }
  110.         protected void Button1_Click(object sender, EventArgs e)
  111.         {
  112.             //这里主要是为了把年级值与科目名取出来用。
  113.             //因为年级值,是通过我自己定义的table来取的,所以这里不能用foreach(DataListItem item in this.DataList1.Items)
  114.             //这里的J值就是年级值了
  115.             string strSubject = "";
  116.             string strNum = "";
  117.             for (int j = 0; j < this.DataList1.Items.Count; j++)
  118.             {
  119.                 CheckBoxList CBL1 = (CheckBoxList)this.DataList1.Items[j].FindControl("cbl");
  120.                 for (int i = 0; i < CBL1.Items.Count; i++)
  121.                 {
  122.                     if (CBL1.Items[i].Selected == true)
  123.                     {
  124.                         strNum += (j + 1).ToString() + ",";
  125.                         strSubject += CBL1.Items[i].Text + ",";
  126.                     }
  127.                 }
  128.             }
  129.             Response.Write(strNum.Substring(0,strNum.Length-1) + "<br>");
  130.             Response.Write(strSubject.Substring(0, strSubject.Length - 1));
  131.         }
  132.         
  133.     }
  134. }

这里要说明的是,一个列表控件来里嵌套了二个控制。一个是CheckBox,一个是CheckBoxList。在选中CheckBox时,它下面的CheckBoxList要被全选中。我认为里是一个要注意的地方。
如果你有更好的方法,请留言告诉我。十分感谢


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值