我用三个dropdownlist联动,而且三个的autopostback都设置了true了,可是选择时相关的dropdownlist没有反应,我跟了一下程序,没有执行selectdeindexchanged过程,我点页面的一个按钮才会有反应,可是我明明设置了autopostback了啊,郁闷,为什么啊?谢谢

解决方案 »

  1.   

    <asp:DropDownList ID="ddlMove" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlMove_SelectedIndexChanged">
                            <asp:ListItem>--移动到--</asp:ListItem>
                            <asp:ListItem>收件箱</asp:ListItem>
                            <asp:ListItem>发件箱</asp:ListItem>
                            <asp:ListItem>草稿箱</asp:ListItem>
                            <asp:ListItem>垃圾箱</asp:ListItem>
    </asp:DropDownList>看有没有OnSelectedIndexChanged="ddlMove_SelectedIndexChanged"
      

  2.   

    把你的DropDownList输出客户端的html标签贴出来,看看onchange属性是怎么写的,有没有被在客户端改变。你的所谓“联动”,看起来在页面下载在客户端只有可能又搞了什么。
      

  3.   

    如果你平常的责任是写商用软件,不要抄袭网上充斥的那些经不起推敲的代码,要按照商品化组件的标准去检验和严格证明代码可以像组件一样被可靠地组合进任何用户控件、绑定进任何GridView的模板中等等。
      

  4.   

    <asp:DropDownList ID="ddlMove" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlMove_SelectedIndexChanged">
                            <asp:ListItem>--移动到--</asp:ListItem>
                            <asp:ListItem>收件箱</asp:ListItem>
                            <asp:ListItem>发件箱</asp:ListItem>
                            <asp:ListItem>草稿箱</asp:ListItem>
                            <asp:ListItem>垃圾箱</asp:ListItem>
    </asp:DropDownList>看有没有OnSelectedIndexChanged="ddlMove_SelectedIndexChanged"
    ============================================================================
    谢谢,我用的.net2003我在属性里加了
      

  5.   

    把你的DropDownList输出客户端的html标签贴出来,看看onchange属性是怎么写的,有没有被在客户端改变。你的所谓“联动”,看起来在页面下载在客户端只有可能又搞了什么。
    =============================================================================
    function __doPostBack(eventTarget, eventArgument) {
    var theform;
    if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
    theform = document.forms["Form1"];
    }
    else {
    theform = document.Form1;
    }
    theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
    theform.__EVENTARGUMENT.value = eventArgument;
    theform.submit();
    }
    ====================================================
    是这个吗??不好意思,我看不大懂:P
      

  6.   

    如果你平常的责任是写商用软件,不要抄袭网上充斥的那些经不起推敲的代码,要按照商品化组件的标准去检验和严格证明代码可以像组件一样被可靠地组合进任何用户控件、绑定进任何GridView的模板中等等。
    ==========================================================
    哦,谢谢前辈的忠告,我刚学.net,这个系统是第一个.net作品,自己一个人搞有点郁闷,很多东西还不熟,呵呵,谢谢
      

  7.   

    首先贴出你的DropdownList控件所对应的html标签。例如你下拉选项中有“北京”,那么你就在客户端源代码中找“北京”,然后看看它附近的代码,确认是那个DropDownList就贴出来。之后,看看这个标签的onchange属性,以及有没有代码修改了这个dhtml事件。既然你是抄的“联动”代码,那么我估计100%它会修改onchange事件,否则就不是“联动”的。但是我并不能预见到它是怎么在javascript改的,因为我从来没有看过那种功能的代码。
      

  8.   

    把你的DropDownList输出客户端的html标签贴出来,看看onchange属性是怎么写的,有没有被在客户端改变。你的所谓“联动”,看起来在页面下载在客户端只有可能又搞了什么。
    ====================================================================
    <tr>
      <td bgColor="#ebf4fc">
      <table cellSpacing="0" cellPadding="0" width="100%" border="0">
        <tr height="30">
          <td align="left" width="25%">&nbsp;&nbsp;<font size="2"><b>机构</b></font></td>
          <td>
          <select name="ddli_jg" onchange="__doPostBack('ddli_jg','')" language="javascript" id="ddli_jg" style="width:180px;">
    <option value="1">天津公司</option>
    <option value="2">北京公司</option>
    <option value="3">上海公司</option>
    <option value="4">重庆公司</option>
          </select>
          </td>
        </tr>
      </table>
      </td>
    </tr>
    <tr>
      <td bgColor="#ebf4fc">
      <table cellSpacing="0" cellPadding="0" width="100%" border="0">
        <tr height="30">
          <td width="25%">&nbsp;&nbsp;<font size="2"><b>部门:</b></font></td>
          <td>
          <select name="ddli_bm" onchange="__doPostBack('ddli_bm','')" language="javascript" id="ddli_bm" style="width:180px;"></select>
           </td>
         </tr>
       </table>
       </td>
    </tr>
    这事前两个dropdownlist的客户端
      

  9.   

    不能触发indexchange事件dropdownlist里面可能有两个值一样的选项,LZ检查一下。
      

  10.   

    首先贴出你的DropdownList控件所对应的html标签。例如你下拉选项中有“北京”,那么你就在客户端源代码中找“北京”,然后看看它附近的代码,确认是那个DropDownList就贴出来。之后,看看这个标签的onchange属性,以及有没有代码修改了这个dhtml事件。既然你是抄的“联动”代码,那么我估计100%它会修改onchange事件,否则就不是“联动”的。但是我并不能预见到它是怎么在javascript改的,因为我从来没有看过那种功能的代码。
    =====================================================================================
    其他代码有抄的,但这个确实没抄,所谓联动,是别人这么叫,我也不知道怎么叫好,就是三个dropdownlist数据都是从数据库中取,第一个选择一个后,第二个就回显示与第一个相关的数据选择,第三个和第二个相关,html贴出来了,第一个的绑定了数据,可是第二个没有,因为我是在第一个dropdownlist的selectedindexchanged事件查和第一个dropdownlist相关的数据在绑定的,可是现在第一个dropdownlist改变选择后没有自动postback,我点按钮回传后才能显示我想要的结果,情况就是这样的,谢谢您:)
      

  11.   

    那是因为你把没有把dropdownlist的绑定放在 !postback 里 
    所以每次autopostback 都会再次初始化绑定dropdownlist,所以没达到联动效果
      

  12.   

    不能触发indexchange事件dropdownlist里面可能有两个值一样的选项,LZ检查一下。
    =============================================================================
    哦,这个我上网查到过,可是我跟程序了,四个item的value不一样,1,2,3,4没错啊,
    谢谢您:)
      

  13.   

    DropDownList选中项变化后回传到服务,操作是在这个方法里执行的SelectedIndexChanged()。要在这个方法里进行相关查询并再次绑定后面的两个DropDownList
      

  14.   

    那是因为你把没有把dropdownlist的绑定放在 !postback 里 
    所以每次autopostback 都会再次初始化绑定dropdownlist,所以没达到联动效果
    =========================================================================
    您是说第一个dropdownlist的绑定吗??我放在里面了啊,代码如下:
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!IsPostBack)
    {
        ddli_jg_bind();
    }

    }
    private void ddli_jg_bind()
    {
    try
    {
    SqlConnection myConnection=new SqlConnection(common_cs.database.connectionstr);
    myConnection.Open();
    string strjg="select * from JGBMB where prejgbmid=0";
    SqlDataAdapter myDataAdapter=new SqlDataAdapter(strjg,myConnection);
    DataSet myds=new DataSet();
    myDataAdapter.Fill(myds,"JGBMB");
             ddli_jg.DataBind();
    myConnection.Close();

    }
    catch(Exception ex)
    {
    Response.Write("<script>alert('"+ex.Message+"')</script>");
    }

    }
      

  15.   

    DropDownList选中项变化后回传到服务,操作是在这个方法里执行的SelectedIndexChanged()。要在这个方法里进行相关查询并再次绑定后面的两个DropDownList
    ==========================================================================
    这个我也是放在里面的啊,代码如下:
    private void ddli_jg_SelectedIndexChanged(object sender, System.EventArgs e)  //选择机构
    {

    try
    {
    SqlConnection myConnection=new SqlConnection(common_cs.database.connectionstr);
    myConnection.Open();
    string strbm="select * from JGBMB where prejgbmid='"+ddli_jg.SelectedItem.Value+"'";
    SqlDataAdapter myDataAdapter1=new SqlDataAdapter(strbm,myConnection);
    DataSet myds1=new DataSet();
    myDataAdapter1.Fill(myds1,"JGBMB");
    ddli_bm.Items.Clear();
    ddli_bm.DataValueField=myds1.Tables["JGBMB"].Columns["jgbmid"].ToString();
    ddli_bm.DataTextField=myds1.Tables["JGBMB"].Columns["jgbmm"].ToString();
    ddli_bm.DataSource=myds1.Tables["JGBMB"].DefaultView;
    ddli_bm.DataBind();
    myConnection.Close();
    }
    catch(Exception ex)
    {
    Response.Write("<script>alert('"+ex.Message+"')</script>");
    }
    }
      

  16.   

    我看到了“联动”二字,有点联想多了!如果你的代码就是上面显示出来的,只要看到 onchange="__doPostBack('ddli_jg','')" ,接下来你在page_load上设置断点,如果第一个dropdownlist改变之后执行了page_load,那就是执行了postback,而不是你说的“没有自动postback”。此时,那么你查 ddli_jg 的事件属性是否完好。(不过如果你使用vs2005这点上基本不会出问题,而使用vs.net2003在经常丢失联系需要重新设置)
      

  17.   

    我看到了“联动”二字,有点联想多了!如果你的代码就是上面显示出来的,只要看到 onchange="__doPostBack('ddli_jg','')" ,接下来你在page_load上设置断点,如果第一个dropdownlist改变之后执行了page_load,那就是执行了postback,而不是你说的“没有自动postback”。此时,那么你查 ddli_jg 的事件属性是否完好。(不过如果你使用vs2005这点上基本不会出问题,而使用vs.net2003在经常丢失联系需要重新设置)
    ==========================================================================
    根据您说的,我在page_load里设置了断点,在我改变ddli_jg的选项时没有重新执行page_load,点按钮才能执行,两次都是<option selected="selected" value="1">天津公司</option>,只有点按钮时才变成selected value="2",应该也就说没有执行autopostback是吧,为什么呢?
      

  18.   

    把你后台的代码贴出来看看
    ===============================
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;namespace localhost.backadmin_sub
    {
    /// <summary>
    /// back_sub_xyselect 的摘要说明。
    /// </summary>
    public class back_sub_xyselect : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button reset;
    protected System.Web.UI.WebControls.DropDownList ddli_bm;
    protected System.Web.UI.WebControls.DropDownList ddli_xm;
    protected System.Web.UI.WebControls.DropDownList ddli_jg;
    protected System.Web.UI.WebControls.DropDownList ddli_zjh;
    protected System.Web.UI.WebControls.Button submit;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!IsPostBack)
    {
        ddli_jg_bind();
    }

    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.ddli_jg.SelectedIndexChanged += new System.EventHandler(this.ddli_jg_SelectedIndexChanged);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void ddli_jg_bind()
    {
    try
    {
    SqlConnection myConnection=new SqlConnection(common_cs.database.connectionstr);
    myConnection.Open();
    string strjg="select * from JGBMB where prejgbmid=0";
    SqlDataAdapter myDataAdapter=new SqlDataAdapter(strjg,myConnection);
    DataSet myds=new DataSet();
    myDataAdapter.Fill(myds,"JGBMB");
    ddli_jg.DataValueField=myds.Tables["JGBMB"].Columns["jgbmid"].ToString();
    ddli_jg.DataTextField=myds.Tables["JGBMB"].Columns["jgbmm"].ToString();
    ddli_jg.DataSource=myds.Tables["JGBMB"].DefaultView;
    ddli_jg.DataBind();
    myConnection.Close();

    }
    catch(Exception ex)
    {
    Response.Write("<script>alert('"+ex.Message+"')</script>");
    }

    } private void ddli_jg_SelectedIndexChanged(object sender, System.EventArgs e)  //选择机构
    {

    try
    {
    SqlConnection myConnection=new SqlConnection(common_cs.database.connectionstr);
    myConnection.Open();
    string strbm="select * from JGBMB where prejgbmid='"+ddli_jg.SelectedItem.Value+"'";
    SqlDataAdapter myDataAdapter1=new SqlDataAdapter(strbm,myConnection);
    DataSet myds1=new DataSet();
    myDataAdapter1.Fill(myds1,"JGBMB");
    ddli_bm.Items.Clear();
    ddli_bm.DataValueField=myds1.Tables["JGBMB"].Columns["jgbmid"].ToString();
    ddli_bm.DataTextField=myds1.Tables["JGBMB"].Columns["jgbmm"].ToString();
    ddli_bm.DataSource=myds1.Tables["JGBMB"].DefaultView;
    ddli_bm.DataBind();
    myConnection.Close();
    }
    catch(Exception ex)
    {
    Response.Write("<script>alert('"+ex.Message+"')</script>");
    }
    } }
    }
    除了注释掉的代码,都在这了,应该是4个dropdownlist的,只弄了两个因为有问题,那两个还没弄,呵呵
      

  19.   

    把ddli_jg_SelectedIndexChanged()里的查询语句输出看看是什么??还是直接不执行ddli_jg_SelectedIndexChanged()??
      

  20.   

    把ddli_jg_SelectedIndexChanged()里的查询语句输出看看是什么??还是直接不执行ddli_jg_SelectedIndexChanged()??
    ==============================================================
    没执行这个都,因为没有自动postback,谢谢;)
      

  21.   

    在你的page_load、ddli_jg_SelectedIndexChanged的第一行设置断点跟踪看看,跟!postback 没有关系,看看你的代码到底缺少执行哪个部分?如果改变ddli_jg的客户端的值根本不执行page_load,说明autopostback不能执行。如果page_load执行了但是ddli_jg_SelectedIndexChanged根本不执行,说明事件丢失了。如果事件触发了,那么就是你最后重新绑定数据有问题。
      

  22.   

    ............................................那AutoPostBack设为True了没,。。
      

  23.   

    现在根本不能确定是不是你一口咬定的那个autopostback问题,你需要先使用准确的方法缩小范围。
      

  24.   

    ............................................那AutoPostBack设为True了没,。。
    ===============================================================================
    设了:)
      

  25.   

    在你的page_load、ddli_jg_SelectedIndexChanged的第一行设置断点跟踪看看,跟!postback 没有关系,看看你的代码到底缺少执行哪个部分?如果改变ddli_jg的客户端的值根本不执行page_load,说明autopostback不能执行。如果page_load执行了但是ddli_jg_SelectedIndexChanged根本不执行,说明事件丢失了。如果事件触发了,那么就是你最后重新绑定数据有问题。
    ==================================================================
    我在每个过程的第一行都设了断点,执行时,改变ddli_jg的客户端的值没有反应,根本没有执行page_load
      

  26.   

    SelectedIndexChanged这个事件有没有指定相应的过程呢~?
      

  27.   

    指定的话就是第一次databind一定要放在!IsPostBack里
      

  28.   

    确定没有执行page_load?! 又没有特别去修改onchange的脚本,难道你的浏览器禁止了javascript执行?上面所有怀疑服务器端代码的,都可以排除。你需要将客户端脚本拷贝成一个htm文件,单独执行它,使用你的html和javascript知识,借助vs脚本调试功能,去查找客户端的问题。例如将_doPostbakc函数里边增加一行看看能不能执行,打印传递的变量值。
      

  29.   

    去检查客户端脚本,要在那个用来诊断的htm文件上,分别在onchange的第一句、_doPostback函数的第一句,分别放上一个alert('hello');之类的代码,看看执行顺序,进一步缩小范围。
      

  30.   

    SelectedIndexChanged这个事件有没有指定相应的过程呢~?指定的话就是第一次databind一定要放在!IsPostBack里
    ===============================================================
    我的后台代码已经贴出来了啊,
    if(!IsPostBack)
    {
        ddli_jg_bind();
    }
    在里面,相应过程指的是什么呢??是说this.ddli_jg.SelectedIndexChanged += new System.EventHandler(this.ddli_jg_SelectedIndexChanged);
    吗?
      

  31.   

    确定一下,你贴的客户端代码<select name="ddli_jg" onchange="__doPostBack('ddli_jg','')" language="javascript" id="ddli_jg" style="width:180px;">确实还是如此,确实是第一个DropdownList的客户端代码。
      

  32.   

    里面即使有了this.ddli_jg.SelectedIndexChanged += new System.EventHandler(this.ddli_jg_SelectedIndexChanged);
    有时候事件也不一定调用指定的函数,你仔细看看!!!
      

  33.   

    确定没有执行page_load?! 又没有特别去修改onchange的脚本,难道你的浏览器禁止了javascript执行?上面所有怀疑服务器端代码的,都可以排除。你需要将客户端脚本拷贝成一个htm文件,单独执行它,使用你的html和javascript知识,借助vs脚本调试功能,去查找客户端的问题。例如将_doPostbakc函数里边增加一行看看能不能执行,打印传递的变量值。去检查客户端脚本,要在那个用来诊断的htm文件上,分别在onchange的第一句、_doPostback函数的第一句,分别放上一个alert('hello');之类的代码,看看执行顺序,进一步缩小范围。
    ====================================================================================
    确定没有执行,浏览器没有禁止js,我贴出来的那个js脚本是执行程序时用“查看源文件”看的啊,我的程序里没有写js脚本啊,怎么会改写呢,这个源文件改写了也不会对服务器上的程序有影响吧,这个不是服务器处理完程序,传给浏览器然后生成的吗,我不是很明白,刚才我把它存成htm文件试了,这个已经在服务器上处理过的文件执行了怎么能看出来为什么没有执行selectedindexchanged呢??不是很明白,怎么看出来为什么autopostback被改了呢??谢谢
      

  34.   

    <select name="ddli_jg" onchange="__doPostBack('ddli_jg','')" language="javascript" id="ddli_jg" style="width:180px;">确实还是如此,确实是第一个DropdownList的客户端代码。
    ====================================================
    确实是:)
      

  35.   

    你在选择的时候有没有刷屏?
    没有的话就是事件没有指定相应的过程!
    有的话基本就是你重复帮定数据了!里面即使有了this.ddli_jg.SelectedIndexChanged += new System.EventHandler(this.ddli_jg_SelectedIndexChanged);
    有时候事件也不一定调用指定的函数,你仔细看看!!!
    ==============================================================
    没有刷屏啊,如果刷了,不久执行了吗,就是没有执行啊
    我用html窗口双击也能指向这个过程,可是就是不执行,郁闷
      

  36.   

    如果页面交给服务器端去执行,无论如何都会执行page_load事件,而你没跟踪到,说明客户端请求这个页面,那么有关“if(!isPostBack)、事件是否丢失、绑定是否正确”的都没有必要去管了,因为根本没有执行服务器端代码。autopostback属性仅仅做一件事,就是向控件的客户端代码输出onchange="__doPostBack('ddli_jg','')" ,他的目的就是触发页面向服务器提交(Form.Submit),现在也证明代码无误。
      

  37.   

    说明客户端请求这个页面  -->  说明客户端没有请求这个页面客户端根本不请求服务器端,你当然需要调试客户端代码,在服务器端上找原因不是诊断思路。所以我要你确定onchange是否执行了,__doPostBack里边是否执行了。哦,修正一下,你将页面“另存”下来保存(将aspx后缀改为htm后缀)而不是拷贝原代码。当另存的时候,ie会把脚本文件等附属的文件也给你保存在本地,不然在本地可能无法单独执行那个htm.
      

  38.   

    private void ddli_jg_SelectedIndexChanged(object sender, System.EventArgs e)  //选择机构
    我仔细看了你里面的代码,不就是第一次帮定的代码吧!!!
    这样你随便怎么样选择不是永远都是第一次加载的数据???
      

  39.   

    如果页面交给服务器端去执行,无论如何都会执行page_load事件,而你没跟踪到,说明客户端请求这个页面,那么有关“if(!isPostBack)、事件是否丢失、绑定是否正确”的都没有必要去管了,因为根本没有执行服务器端代码。autopostback属性仅仅做一件事,就是向控件的客户端代码输出onchange="__doPostBack('ddli_jg','')" ,他的目的就是触发页面向服务器提交(Form.Submit),现在也证明代码无误。说明客户端请求这个页面  -->  说明客户端没有请求这个页面客户端根本不请求服务器端,你当然需要调试客户端代码,在服务器端上找原因不是诊断思路。所以我要你确定onchange是否执行了,__doPostBack里边是否执行了。哦,修正一下,你将页面“另存”下来保存(将aspx后缀改为htm后缀)而不是拷贝原代码。当另存的时候,ie会把脚本文件等附属的文件也给你保存在本地,不然在本地可能无法单独执行那个htm
    ===================================================================================
    啊啊啊啊啊啊啊啊啊啊啊啊啊啊,我知道了,我的页面上有个按钮,我把它去掉就可以了,我不知道为什么,可能是.net默认的提交就是您说的Form.Submit指向按钮吧,总之去掉它就可以了,哈哈哈哈
    终于解决了,谢谢以上的所有前辈,耽误你们的时间了,非常感谢,不过难题来了,分不好给了,呵呵,下班了,回家给
    :D
    再次感谢!!!
      

  40.   

    呵呵,不知道你的无敌的按钮到底做了什么呢?网上有不少“特效”的代码,这些都是给你玩的。而你使用asp.net开发的时候,更加强调组件式、插件式的开发,如果你得到一段不具备组件质量的代码,要立刻意识到它会不会把页面上别的组件给搞垮了呢?我习惯于把任何新玩意不论是后台代码还是javascript,都用用户控件包装起来,然后在页面上放上多个或者用GridView等绑定一大批,然后测试一下其可靠性。可以用的,既能达到效果又不破坏别的组件状态的,才会用。
      

  41.   

    呵呵,不知道你的无敌的按钮到底做了什么呢?网上有不少“特效”的代码,这些都是给你玩的。而你使用asp.net开发的时候,更加强调组件式、插件式的开发,如果你得到一段不具备组件质量的代码,要立刻意识到它会不会把页面上别的组件给搞垮了呢?我习惯于把任何新玩意不论是后台代码还是javascript,都用用户控件包装起来,然后在页面上放上多个或者用GridView等绑定一大批,然后测试一下其可靠性。可以用的,既能达到效果又不破坏别的组件状态的,才会用。
    ================================================================================
    呵呵,那个按钮是准备以后提交表单的,还没写它的Onclick事件呢,现在还没作用
    不过id是submit
    谢谢您的忠告,以后其他遇到这些情况我会注意的:)