none
两个DropDownList之间的联动问题 RRS feed

  • 问题

  • 我的意思是这样的:当在DropDownList1(课程名称)中选取一个值,DropDownList2(教师姓名)会显示相应的数据;例如在课程名称中选取一个课程名称,在DropDownList2会显示出相应的授课老师(而不是全部),我的后台代码如下:
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
               ddlCourse1();       
            }


        }
        protected void ddlCourse_SelectedIndexChanged(object sender, EventArgs e)
        {
            //课程下拉列表框更改时,绑定教师下拉列表框
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            //取出连接字符串
            string SqlStr = @"select distinct CourseTable.TeacherID,TeacherTable.TeacherName
                          from TeacherTable,CourseTable
                          where CouseTable.TeacherID=TeacherTable.TeacherID
                          and CourseTable.CourseID=@CourseID";
            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection(connStr);        //创建连接对象
            if (conn.State.ToString() == "Closed")                   //如果连接关闭,打开连接
                conn.Open();
            SqlCommand comm = new SqlCommand(SqlStr, conn);
            comm.Parameters.AddWithValue("@CourseID", ddlCourse.SelectedValue);
            comm.ExecuteNonQuery();
            comm.Dispose();
            SqlDataAdapter da = new SqlDataAdapter(SqlStr, conn);
            da.Fill(ds);                                            //从数据库中取数据放到DataSet数据集中
            if (conn.State.ToString() == "Open")
                conn.Close();
            ddlTeacher.DataSource = ds.Tables[0].DefaultView;
            ddlTeacher.DataTextField = "TeacherName";               //下拉列表框中每项的值为教师名称
            ddlTeacher.DataValueField = "TeacherID";                //下拉列表框中每项的值为教师编号
            ddlTeacher.DataBind();
        }

        public void ddlCourse1()
        {
             string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
             SqlConnection conn = new SqlConnection(connStr);        //创建连接对象
             DataSet ds = new DataSet();
            conn.Open();

            SqlDataAdapter da = new SqlDataAdapter("select * from CourseTable", conn);
            da.Fill(ds);

            ddlCourse.DataValueField = "CourseID";
            ddlCourse.DataTextField = "CourseName";
            ddlCourse.DataSource = ds.Tables[0].DefaultView;
            ddlCourse.DataBind();
        }
    我不知道代码中哪里又有问题,不能实现,请各位帮我看看!

    2010年2月6日 12:52

答案

  • 这个 SQL 使用 SQL Profile 跟踪出来的吗?另外控件 ddlCourse 的 AutoPostBack 属性设置为 true 了吗?
    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年2月7日 5:22
    2010年2月7日 5:18
    版主

全部回复

  • protected void ddlCourse_SelectedIndexChanged(object sender, EventArgs e)
        {
            // 正确的写法
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            string SqlStr = @"select distinct CourseTable.TeacherID,TeacherTable.TeacherName
                          from TeacherTable,CourseTable
                          where CouseTable.TeacherID=TeacherTable.TeacherID
                          and CourseTable.CourseID=@CourseID";
            DataSet ds = new DataSet();
            using (SqlDataAdapter da = new SqlDataAdapter(SqlStr, connStr))
            {
                da.SelectCommand.Parameters.AddWithValue("@CourseID", ddlCourse.SelectedValue);
                da.Fill(ds);
    
                ddlTeacher.DataSource = ds.Tables[0];
                ddlTeacher.DataTextField = "TeacherName";               //下拉列表框中每项的值为教师名称
                ddlTeacher.DataValueField = "TeacherID";                //下拉列表框中每项的值为教师编号
                ddlTeacher.DataBind();
            }
    
    
            // 下面注释的部分是没有意思的,不需要写
            //if (conn.State.ToString() == "Closed")                   //如果连接关闭,打开连接
            //    conn.Open();
            //SqlCommand comm = new SqlCommand(SqlStr, conn);
            //comm.Parameters.AddWithValue("@CourseID", ddlCourse.SelectedValue);
            //comm.ExecuteNonQuery();
            //comm.Dispose();
    
            // 你的问题在这里,使用 SqlDataAdapter 默认是使用 SqlDataAdapter 的 SelectCommand 而你又没有为它添加参数
            //SqlDataAdapter da = new SqlDataAdapter(SqlStr, conn);
            //da.Fill(ds);      
            
            // SQL 建议换成 INNER JOIN 的方式
        }

    知识改变命运,奋斗成就人生!
    2010年2月7日 1:50
    版主
  • 我调试了一下,还是不行!

    2010年2月7日 4:23
  • 不行,是指什么?没有显示?
    知识改变命运,奋斗成就人生!
    2010年2月7日 4:33
    版主
  • 我用了两种调试方法:
    方法一:我对ddlTeacher进行了数据绑定,那么在ddlCourse中选取了一个值过后,ddlTeacher并没有进行相应的更新,而还是原来全部老师的下拉列表;
    方法二:我没有在前台对ddlTeacher进行数据绑定,而是在后台运用了刚刚您写给我的代码,我运行了一下,在点击ddlCourse 之后,ddlTeacher没有任何显示。
    我也不知道为什么,我能想到的方法都试了一下,可还是不行。

    2010年2月7日 4:59
  • 使用方法 2 跟踪一下 SQL 看看最终执行的语句。看看最终用于查询的 @CourseID 是否正确,SQL 是否能在数据库中查出数据。
    知识改变命运,奋斗成就人生!
    2010年2月7日 5:02
    版主
  • 我执行了一下SQL,根据输入 @CourseID的一个值,可以出现相应的教师姓名!

    2010年2月7日 5:14
  • 这个 SQL 使用 SQL Profile 跟踪出来的吗?另外控件 ddlCourse 的 AutoPostBack 属性设置为 true 了吗?
    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年2月7日 5:22
    2010年2月7日 5:18
    版主
  • 好的,前辈谢谢你啦,问题终于解决了,我没有吧ddlCourse 的 AutoPostBack 属性设置为 true 。
    我每次都不太会用你说的那个SQLProfile跟踪,我每次都是使用SQL 查询分析器的,不知道这样是不是能够同样解决问题?
    2010年2月7日 5:22
  • 查询分析器,是 SQL 2000 的。SQL 2000 对应的功能叫 “事件探查器”。
    知识改变命运,奋斗成就人生!
    2010年2月7日 5:24
    版主
  • 是的,我用的就是SQL 2000的!


    前辈,这些天麻烦你了,系统开发至今日,幸亏有了你们的帮助,我才能这么快的开发出来,真的打心底想跟你们说声谢谢!让我对c#有了更深一步的认识与理解。


    我的开发就剩下了最后一个页面了,而这个页面的贴在我已经贴出来了,我之前没遇到过,所以 做起来有些棘手,就是是学生选课页面,共有两个GridView,一个是GridView1,用来显示可选修的课程;另一个是GridView2,用来显示您已经选修的课程。我的想法是这样的在GridView1中点击选修按钮后,该行的记录被移到GridView2中,同时该行记录在GridView1中删除;同时当我点击GridView2中的退选按钮时,该行记录在GridView2中消失,同时显示在GridView1中,我已经用不同的SQL语言对这两个GridView进行了绑定,其中GridView1中的DataSourceID为SqlDataSource1;GridView2中的DataSourceID为SqlDataSource2!可不可以给点提示!

     
    2010年2月7日 5:30
  • 你好!

    这个问题在你另外一个帖子中回复你了。你先看看。

    知识改变命运,奋斗成就人生!
    2010年2月7日 5:32
    版主
  • 前辈,您今天叫我的两个DropDownList的联动问题的方法, 我将修改后的代码,应用到数据查询中,即点击查询按钮,在GridView中会显示相应的学生选课,其后续代码如下(前面的代码我已经在上面贴出来了):
     protected void btnSearch_Click(object sender, EventArgs e)
        {
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            string SqlSelect = @"select  ST1.StudentID,ST1.StudentName,CT.CourseName,CT.TeacherID,ST2.SchoolName,DT.DepartName,ST.SpecialtyName,GT.GradeName,CT1.ClassName,ECT.Score,TT.TeacherName
                               from StudentTable as ST1,SchoolTable as ST2,DepartTable as DT,SpecialtyTable as ST,GradeTable as GT,ClassTable as CT1,ElectCourseTable as ECT,CourseTable as CT,TeacherTable as TT
                               where ST2.SchoolID=DT.SchoolID
                                 and DT.DepartID=ST.DepartID
                                 and ST.SpecialtyID=CT1.SpecialtyID
                                 and GT.GradeID=CT1.GradeID
                                 and CT.CourseTeacherID=ECT.CourseTeacherID
                                 and ECT.StudentID=ST1.StudentID
                                 and ST1.ClassID=CT1.ClassID
                                 and CT.CourseID=@CourseID
                                 and TT.TeacherID=@TeacherID";
            SqlConnection conn = new SqlConnection(connStr);                                //创建连接对象
            SqlCommand cmd = new SqlCommand(SqlSelect, conn);                               //执行查询
         
           
            try
            {                                               
                if (conn.State.ToString() == "Closed")    //如果连接关闭,打开连接
                    conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(SqlSelect, conn);
                da.SelectCommand.Parameters.AddWithValue("@CourseID", ddlCourse.SelectedValue);
                da.SelectCommand.Parameters.AddWithValue("@TeacherID", ddlTeacher.SelectedValue);
               
                cmd.ExecuteNonQuery();              //执行查询
            }
            catch (Exception ex)                          //异常处理
            {
                Response.Write("数据库错误,错误原因:" + ex.Message);
                Response.End();
            }

            finally
            {
                cmd.Dispose();
                cmd.Dispose();
                if (conn.State.ToString() == "Open")               //如果连接打开,关闭连接
                    conn.Close();
            }
            GridViewBind();      //数据绑定
            
        }
    它显示的错误是:数据库错误,错误原因:必须声明变量 '@CourseID'
    SQL语言的执行是正确的,我执行了一下

    2010年2月7日 15:40