我现在的问题是这样,麻烦高手帮我看下~
1:我有2个dropdownlist控件,DD1和DD2
还有3张数据表T1和T2,T3
2:需要实现的功能是:
DD1绑定T1的A字段,
当选择DD1的A1记录时,DD2读取表T2的某字段,然后textbox中需要显示T2表的其他字段中的记录~
当选择DD1的A2记录时,DD2读取表T3的某字段,然后textbox中需要显示T3表的其他字段中的记录~
依此类推……
3:我使用的方法
1)我在Pageload里把T1手动绑定到DD1,DD1,DD2的Aotupostback都为true,
 
protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack)
        {
          //数据绑定……
        }
  }2)我在DD1的SelectedIndexChanged事件中这样写 
protected void DD_Class_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (!IsPostBack)//这里是否应该判断回发,如果不判断,DD2里就没有显示,
//判读以后的问题是如果我选择DD1的第二条记录时,显示出来的是T1中的记录加上T2中的记录

        {
           if(DD1.SelectedIndex == 1)
          {
             //绑定T2
             //读取T2数据给Textbox赋值
          }
          if(DD1.SelectedIndex == 2)
          {
             //绑定T3
             //读取T3数据给Textbox赋值
          }
}
3:我的问题就是怎么能让DD2能显示正常。还有关于IsPostBack到底是什么意思~

解决方案 »

  1.   

    写得急,把auto写成aotu了。大家嘲笑我吧~
    还有就是我对JS不熟悉,这个刷新不刷新都无所谓,用C#写好了,功能正常就OK了。麻烦大家帮我看看~分不够可以另外开贴加
      

  2.   

    IsPostBack介绍 IsPostBack是Page类有一个bool类型的属性,用来判断针对当前Form的请求是第一次还是非第一次请求。
    当IsPostBack=true时表示非第一次请求
    Aotupostback=true
    protected void DD_Class_SelectedIndexChanged(object sender, EventArgs e)
     {
             if(DD1.SelectValue == "A1")
              {
                 //绑定T2
                 //读取T2数据给Textbox赋值
               }
              if(DD1.SelectValue == "A2")
              {
                 //绑定T3
                 //读取T3数据给Textbox赋值
               }
    }
      

  3.   

    建议用ajaxpro做无刷新联动,,,
    http://www.51aspx.com/CV/AjaxProDropDownList/
      

  4.   

    同样还是存在我考虑是不是我给DD1绑定了T2的数据后没有释放资源,然后就绑定T3,结果数据就加一起了~
      

  5.   

    我就是想自己手动实现这个功能。我也有装ajax control toolkit~
      

  6.   

    你绑定数据前有没有做清空?就是DD1.DATASOURCEID=NULL..
      

  7.   

    试了一下。没作用~ 估计不是数据的问题了。
    好像就是回发的问题~
    我再加断点看看~
    贴上我的绑定代码:if (!IsPostBack)
            {
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FoodtechConnectionString"].ToString());
                string strsql0 = "select * from TitleClass";    
                SqlDataAdapter adp0 = new SqlDataAdapter(strsql0, conn);
                try
                {
                    conn.Open();
                    DataSet dt = new DataSet();
                    adp0.Fill(dt,"TitleClass");
                    DD_Class.AppendDataBoundItems = true;
                    DD_Class.Items.Add(new ListItem("-请选择 -", "0"));
                    DD_Class.DataSource = dt.Tables[0].DefaultView;
                    DD_Class.DataTextField = "Text";
                   // DD_Class.DataValueField = "Number";
                    DD_Class.DataBind();
                  
                }
                catch
                {
                    Response.Write("<script>alert('数据库连接错误');history.go(-1);</script>");
                }
                finally
                {
                    conn.Close();
                    conn.Dispose();
                    adp0.Dispose();            }
      

  8.   

    我后来加了DATASOURCEID=NULL了。没用。所以就没加上
      

  9.   

    T2,T3 这两上绑定到DD2,能通过select????区分开来吗?如果可以就好处理
    protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack)
            {
              //绑定DD1;
            }
      }
    protected void DD_Class_SelectedIndexChanged(object sender, EventArgs e)
        {
               if(DD1.SelectedIndex == 1)
              {
                 //绑定T2
                 //读取T2数据给Textbox赋值
              }
              if(DD1.SelectedIndex == 2)
              {
                 //绑定T3
                 //读取T3数据给Textbox赋值
              }
    }
    //DD2的SelectedIndexChanged事件
    protected void DD2_SelectedIndexChanged(object sender, EventArgs e)
        {
        string selectvalue=DD2.selectvalue;
        //判断selectvalue对应的是哪个表 ,读相应的数据      
        
    }
    3:我的问题就是怎么能让DD2能显示正常。还有关于IsPostBack到底是什么意思~ 楼上已经解释
      

  10.   

    就是通过select不同的表来区别开的啊~
      

  11.   

    现在问题在这里:
    在第二个DropDownList中是否要判断IsPostBack
    如果我写 if(!IspPostBack)那么DD2中就没有数据显示,如果我写成if (IsPostBack),那么在DD1里每选择一次数据,DD2就会多一条记录,无限叠加~
      

  12.   

    有?  如果你的DD1的SelectedIndexChanged()中写的是 if(!isPostBack)那DD2不可能绑到数据啊。  IsPostBack就是判断页面是不是二次回发,SelectedIndexChanged()会使其变为true。 !isPostBack就一直为false如果写的是if(isPostBack) 那么我想问下页面加载进来后当你第一次点击DD1后DD2有没有数据? 有的话你点DD2它的事件会不会触发?
      

  13.   


    谢谢,我发现问题了
    我在DD1中用了if(!isPostBack),才能使DD1中的数据正常显示,而我的SelectedIndexChanged()中写if(!isPostBack)数据就绑不上了,如果写if(isPostBack)那么数据能够显示,但是我DD1选第2项的时候,数据会加到第一项的后面。请问怎么解决
      

  14.   

    protected void DD_Class_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!IsPostBack)//这里是否应该判断回发,如果不判断,DD2里就没有显示,
    //判读以后的问题是如果我选择DD1的第二条记录时,显示出来的是T1中的记录加上T2中的记录

            {
               if(DD1.SelectedIndex == 1)
              {
                 //绑定T2
                 //读取T2数据给Textbox赋值
              }
              if(DD1.SelectedIndex == 2)
              {
                 //绑定T3
                 //读取T3数据给Textbox赋值
              }
    }
    中if (!IsPostBack)不需要的,你把这里的代码犬拿出来嘛。
      

  15.   

    IsPostBack 
    1. 获取一个值,该值指示该页是否正为响应客户端回发而加载,如果是为响应客户端回发而加载该页,则为 true;
    2. 是否正被首次加载和访问, 是就返回false。
      

  16.   


    protected void DD1_SelectedIndexChanged(object sender, EventArgs e)
        {
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FoodtechConnectionString"].ToString());
                string strsql1 = "select * from News1";
                string strsql2 = "select * from News2";
                SqlDataAdapter adp1 = new SqlDataAdapter(strsql1, conn);
                SqlDataAdapter adp2 = new SqlDataAdapter(strsql2, conn);
             //读入数据
                conn.Open();
                DataSet dt = new DataSet();
                adp1.Fill(dt,"News1");
                adp2.Fill(dt, "News2");
              if (DD1.SelectedIndex==1)
                {
                    DD2.ClearSelection();
                    DD2.DataSourceID = null;
                    DD2.AppendDataBoundItems = true;
                    DD2.DataSource = dt.Tables[0].DefaultView;
                    DD2.DataTextField = "Title";
                    DD2.DataBind();       
                }
                if (DD1.SelectedIndex==2)
                {
                    DD2.ClearSelection();
                    DD2.DataSourceID = null;
                    DD2.AppendDataBoundItems = true;
                    DD2.DataSource = dt.Tables[1].DefaultView;
                    DD2.DataTextField = "Title";
                    DD2.DataBind(); 
                }
          conn.Close();
    }
      

  17.   

    代码改成楼上那种以后
    结果就是DD1选第中第一项,那么DD2中显示正常,选择DD1中的第二项,那么DD2中就是News1中的记录加上表News2的记录。如果再选DD1的第一项,News1的记录又会继续加到后面
      

  18.   

    //读入数据
                conn.Open();
                DataSet dt = new DataSet();
                if (DD1.SelectedIndex==1)
                {
                    adp1.Fill(dt,"News1"); 
                }
                if (DD1.SelectedIndex==2)
                {
                    adp2.Fill(dt, "News2");
                }
                conn.Close();                DD2.ClearSelection();
                    DD2.DataSourceID = null;
                    DD2.AppendDataBoundItems = true;
                    DD2.DataSource = dt.Tables[0].DefaultView;
                    DD2.DataTextField = "Title";
                    DD2.DataBind();       这样试试。还有,SelectedIndex应该是从0开始的,注意值是否正确
      

  19.   

    那你打断点看看究竟这里的值是怎么回事。直接写为
                    DD2.DataSource = dt.Tables[0]; 
                    DD2.DataTextField = "Title"; 
                    DD2.DataBind();   
    不行吗?我一般就这么写的啊。   
      

  20.   

    你把给DD2绑定数据源的代码写到page_load()中试下:在 page_load()中判断DD1的选定值然后给DD2绑定。
      

  21.   

    解决了。谢谢大家。原来是下拉条控件的问题~ 非常郁闷~
    在绑定数据之前要调用Item.Clear()来把前一次的Item清除掉。不然就都叠在一起了~
    结贴!
      

  22.   

    因为我觉得DataBind()是在page_load()之后执行的,也就是说:
    1.页面第一次加载后DD1有了数据源,DD2还没有。
    2.第一次点击DD1,生成DD2的数据源,并绑定上去
    3.postback发生,页面刷新
    4.Pageload完成
    5.DataBind()被真正执行,DD2中有了数据
    6.第二次点击DD1 发生postback页面再次刷新
    7.pageload完成,此时DD2的数据源还没有更新
    8.DataBind()被执行,DD2中的数据产生了叠加所以你把DD2的DataBind()加到page_load中去试下.不知道上面讲的对不对,仅做为一种可能。这个问题要真正解决还得去了解页面的生命周期才行。