protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bind();
            
        }
    }    public void bind()
    {
        string sqlStr = "select * from Employee";
        DataSet myds = Common.dataSet(sqlStr);
        GridView1.DataSource = myds;
        GridView1.DataKeyNames = new string[] { "ID" };
        GridView1.DataBind();        AccessDataSource s = new AccessDataSource("E:\\WebSite\\GridViewExamples\\GridViewExamples\\App_Data\\Example.mdb", "select * from Employee");
        this.GridView1.DataSourceID = s.ID;
        this.GridView1.DataBind();
    }
   protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DropDownList ddlrefresh = (DropDownList)e.Row.FindControl("ddlRefresh");            //ddlrefresh.NamingContainer
            ddlrefresh.AutoPostBack = true;
            ddlrefresh.SelectedIndexChanged += new EventHandler(ddlrefresh_SelectedIndexChanged);
        }
    }    protected void ddlrefresh_SelectedIndexChanged(object sender, EventArgs e)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "script13", "<script>alert('ddlrefresh_SelectedIndexChanged')</script>");
    }上面这样写dropdownlist 的事件永远不触发?
但是当代码换成     <asp:TemplateField>
                <ItemTemplate>
                    <asp:DropDownList ID="ddlRefresh" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlrefresh_SelectedIndexChanged">                        <asp:ListItem Value="1">1</asp:ListItem>
                        <asp:ListItem Value="2">2</asp:ListItem>
                        <asp:ListItem Value="3">3</asp:ListItem>
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>就会执行。
这是为什么呢?为什么第一种方法不执行呢?

解决方案 »

  1.   

    ddlrefresh.AutoPostBack = true;如果直接在前台点成true而不在后台设置呢?如果还不行的话设置断点跟踪一下看看
      

  2.   

    DropDownList 一般都是用在模版列之中的
      

  3.   



    前台设置了,也没有用断点根本不会执行ddlrefresh_SelectedIndexChanged

      

  4.   


    ddlrefresh.AutoPostBack = true;如果直接在前台点成true而不在后台设置呢?如果还不行的话设置断点跟踪一下看看前台设置了,也没有用
    断点根本不会执行ddlrefresh_SelectedIndexChanged
      

  5.   

    看一下生成的Html,在页面加和在代码加是不是一样
      

  6.   

    我试了试代码,情况确实如此,原因在于,你的事件绑定是放在 IsPostBack中的,当页面回传时,页面类的实例已经不是第一次生成的了,所以在回传页面的时候,不再去进行事件绑定
      

  7.   

    是否在这种情况下,bind()应放在ispostback外,才能正常.
    回去试试.
      

  8.   

       放在外面确实可以,但是最好的方法是把只把事件绑定放在IsPostback外面,如果把Bind都放到外面,你就取不到回传的值,因为每次回来都重新绑定了。
       知道原因后,建议还是只在页面修改吧,这样省去很多事情,.NET会放在外面的,不用自己处理
      

  9.   

    应该不是放不放在外面的问题吧现在已经测试成功了我实现在方法如下:
     protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DropDownList ddlrefresh = (DropDownList)e.Row.FindControl("ddlRefresh");            //ddlrefresh.NamingContainer
                ddlrefresh.AutoPostBack = true;
                ddlrefresh.SelectedIndexChanged += new EventHandler(ddlrefresh_SelectedIndexChanged);        }
        }
    将事件代码加入到
    RowCeated就行了。