我写了个2个dropdownlist联动,程序能运行起来,但有2个问题:
一 点击第一个dropdownlist1(hylb_type)时候,总是刷新页面;
二 点击第一个dropdownlist1(hylb_type)选择菜单时,第2个dropdownlist2(hylb_name)不跟随着变。第一次打开页面都能正常显示,请大家指点下,是不是哪里有逻辑错误或是别的错误。谢谢!
                                                          部分代码如下:
protected override void OnInit(EventArgs e) 
{
if (SkinName == null)                
ExternalSkinFileName = "qiye.ascx";
else 
ExternalSkinFileName = SkinName; base.OnInit(e);
} protected override void OnLoad(EventArgs e) 
{
if ( !Page.IsPostBack ) 
{
DataBind();
}
base.OnLoad( e );
}
protected override void AttachChildControls()
{
                        hylb_type = (DropDownList)FindControl("hylb_type");
hylb_name = (DropDownList)FindControl("hylb_name");
                 }public override void DataBind()
{
base.DataBind();
                        
                        DataSet dshylb_type = new DataSet();
const string cacheKey4 = "hyLB_type";
dshylb_type = myCache.Get(cacheKey4) as DataSet;

if(dshylb_type == null)
{
dshylb_type = SqlHelper.ExecuteDataset(Globals.ConnStr(), CommandType.Text, "SELECT  distinct hylb_type FROM T_Hylb");
myCache.Insert(cacheKey4,dshylb_type,3 * myCache.MinuteFactor);
}

hylb_type.DataSource = dshylb_type.Tables[0].DefaultView;
hylb_type.DataTextField  = "hylb_type";
hylb_type.DataValueField = "hylb_type";
hylb_type.DataBind();

DataSet ds = new DataSet();
const string cacheKey5 = "ds";
ds = myCache.Get(cacheKey5) as DataSet;

if(ds == null)
{
ds = SqlHelper.ExecuteDataset(Globals.ConnStr(), CommandType.Text, "SELECT hylb_type FROM T_Hylb WHERE hylb = (select hylb from t_corpinfo where corpid ='" + Page.Request.Params["qid"] + "' and flag <> 2)" );
myCache.Insert(cacheKey5,ds,3 * myCache.MinuteFactor);
}

DataSet dshylb_name = new DataSet();
const string cacheKey7 = "hyLB_name";
dshylb_name = myCache.Get(cacheKey7) as DataSet;
if(dshylb_name == null)
{
dshylb_name = SqlHelper.ExecuteDataset(Globals.ConnStr(), CommandType.Text, "SELECT * FROM T_Hylb WHERE hylb_type = '"+ds.Tables[0].Rows[0][0].ToString()+"'");
myCache.Insert(cacheKey7,dshylb_name,3 * myCache.MinuteFactor);
}
if(dshylb_name.Tables[0].Rows.Count > 0) 
{
hylb_name.DataSource = dshylb_name.Tables[0].DefaultView;
hylb_name.DataTextField  = "hylb_name";
hylb_name.DataValueField = "hylb";
hylb_name.DataBind();
}if(null == Page.Request.Params["qid"] || Page.Request.Params["qid"].ToString() == "")
{
return;
} SqlDataReader dr =
SqlHelper.ExecuteReader(Globals.ConnStr(), CommandType.Text,
"select * from t_corpinfo where corpid ='" + Page.Request.Params["qid"] + "' and flag <> 2" ); if(!dr.HasRows)
{
Page.Response.Redirect(Globals.ApplicationPath+"/msg.aspx?type=delqiye");
} while(dr.Read())
{
                          if(ds.Tables[0].Rows.Count > 0)
{
hylb_type.SelectedValue = ds.Tables[0].Rows[0][0].ToString(); 
}

hylb_name.SelectedValue = dr["hylb"].ToString();
                         }private void InitializeChildControls() 
{
hylb_type.SelectedIndexChanged += new System.EventHandler(hylb_type_SelectedIndexChanged); 
}private   void   hylb_type_SelectedIndexChanged(object sender,System.EventArgs e)
{
DataSet dshylb_name = new DataSet();
const string cacheKey6 = "hyLB_name";
dshylb_name = myCache.Get(cacheKey6) as DataSet;
if(dshylb_name == null)
{
dshylb_name = SqlHelper.ExecuteDataset(Globals.ConnStr(), CommandType.Text, "SELECT * FROM T_Hylb WHERE hylb_type =  '" + hylb_type.SelectedItem.Text +"' ");
myCache.Insert(cacheKey6,dshylb_name,3 * myCache.MinuteFactor);
}
if(dshylb_name.Tables[0].Rows.Count > 0) 
{
hylb_name.DataSource = dshylb_name.Tables[0].DefaultView;
hylb_name.DataTextField  = "hylb_name";
hylb_name.DataValueField = "hylb";
hylb_name.DataBind();
}

解决方案 »

  1.   

    ASP页面代码
    <asp:dropdownlist class="selectList" id="hylb_type" runat="server" AutoPostBack = True ></asp:dropdownlist>
    <asp:dropdownlist class="selectList" id="hylb_name" runat="server"></asp:dropdownlist>
      

  2.   

    dropdownlist1是服务器控件,当选择时是要刷新页面的,想不刷新的话可以使用ajax.
    要使两个连动需要选定dropdownlist1时根据连动条件(如外键)重新绑定dropdownlist2
      

  3.   

    AutoPostBack   =   True   去掉或修改为false就不会刷新了.不过这样好象不能联动
      

  4.   

    楼上2位的意思我都明白了,刷新问题我会去查下ajax,但第2个问题还是没解决,我就是按选定dropdownlist1时根据连动条件重新绑定dropdownlist2的,代码有点乱,需要的话我从新注释发下。
     
      

  5.   

    是不是根据dropdownlist1的选择项来绑定2的?而且是在dropdownlist1的change事件里写的
      

  6.   

    现在我做了:
    1 AutoPostBack="True" 
    2 事件也注册了 hylb_type.SelectedIndexChanged   +=   new   System.EventHandler(hylb_type_SelectedIndexChanged);   
    3 事件也写了private       void       hylb_type_SelectedIndexChanged(object   sender,System.EventArgs   e) 

    DataSet   dshylb_name   =   new   DataSet(); 
    dshylb_name   =   SqlHelper.ExecuteDataset(Globals.ConnStr(),   CommandType.Text,   "SELECT   *   FROM   T_Hylb   WHERE   hylb_type   =     '"   +   hylb_type.SelectedItem.Text   +"'   "); 
     
    if(dshylb_name.Tables[0].Rows.Count   >   0)   

    hylb_name.DataSource   =   dshylb_name.Tables[0].DefaultView; 
    hylb_name.DataTextField     =   "hylb_name"; 
    hylb_name.DataValueField   =   "hylb"; 
    hylb_name.DataBind(); 
    } 4 初始化也绑定数据原了 
    DataSet dshylb_type = new DataSet();//行业类别
    dshylb_type = SqlHelper.ExecuteDataset(Globals.ConnStr(), CommandType.Text, "SELECT  distinct hylb_type FROM T_Hylb");
    hylb_type.DataSource = dshylb_type.Tables[0].DefaultView;
    hylb_type.DataTextField  = "hylb_type";
    hylb_type.DataValueField = "hylb_type";
    hylb_type.DataBind();
    DataSet dshylb_name = new DataSet();//行业类别明细
    dshylb_name = SqlHelper.ExecuteDataset(Globals.ConnStr(), CommandType.Text, "SELECT * FROM T_Hylb WHERE hylb_type = '"+ds.Tables[0].Rows[0][0].ToString()+"'");if(dshylb_name.Tables[0].Rows.Count > 0) 
    {
    hylb_name.DataSource = dshylb_name.Tables[0].DefaultView;
    hylb_name.DataTextField  = "hylb_name";
    hylb_name.DataValueField = "hylb";
    hylb_name.DataBind();
    }为什么没有实现联动效果
      

  7.   

    那就要设断点检查了.看看数据是否获取,SQL 语句执行时是否是预期的.代码好象是正确的.
      

  8.   

    2个下拉框组成的联动菜单实际上非常简单,只需要在第一个下拉框的SelectedIndexChanged事件中加入绑定第二个下拉框数据的代码,这是比较初级的方法,AutoPostBack="True"!!
      

  9.   

    对了,提到断点调试,我想问下 “lyg1166 ”,我用的是VS2003,断点调试的时候怎么没象VS2005那样把鼠标停留在变量上,就会出现个标签显示这个变量的当前值啊?还是得调什么?谢谢