有一表结构:
id
GoodsName
Specification
Price
Place
PhotoUrl
st1Class
st2Class
st3Class我想用一dropdownlist显示st1Class,改变选项时gridview显示相应的st2Class项
前台:<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DropDownList1" runat="server" DataTextField="GoodsName" AutoPostBack="true" DataValueField="st1Class" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
        </asp:DropDownList>
        <br />
        <br />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField HeaderText="分类" DataField="GoodsName" />
                <asp:BoundField HeaderText="类ID" DataField="st1Class" />
            </Columns>
        </asp:GridView>
 
    </div>
    </form>
</body>后台:    protected void Page_Load(object sender, EventArgs e)
    {
        string strConnection = "Provider=MicroSoft.Jet.OleDb.4.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("App_Data/FKJdata.mdb");
        OleDbConnection myObjConnection = new OleDbConnection(strConnection);
        try
        {
            string queryString = "select GoodsName,St1Class from goodslist where st2Class is null and st3Class is null";
            OleDbDataAdapter apReturnSt1 = new OleDbDataAdapter(queryString,myObjConnection);
            DataSet dsSt1Class = new DataSet();
            apReturnSt1.Fill(dsSt1Class);
            DropDownList1.DataSource = dsSt1Class;
            DropDownList1.DataBind();
        }
        finally
        {
            myObjConnection.Close();
        }    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string strConnection = "Provider=MicroSoft.Jet.OleDb.4.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("App_Data/FKJdata.mdb");
        OleDbConnection myObjConnection = new OleDbConnection(strConnection);
        try
        {
            string queryString="select GoodsName,St1Class from goodslist where st3Class is null and st2Class is not null and st1Class=?";
            OleDbCommand myCommand = new OleDbCommand(queryString, myObjConnection);
            OleDbParameter myParameter = new OleDbParameter("strSt1Class", OleDbType.VarChar, 30);
            myParameter.Direction = ParameterDirection.Input;
            myCommand.Parameters.Add(myParameter);
            myCommand.Parameters["strSt1Class"].Value = DropDownList1.SelectedValue;
            OleDbDataAdapter apReturnSt2 = new OleDbDataAdapter(myCommand);
            DataSet dsSt2Class = new DataSet();
            apReturnSt2.Fill(dsSt2Class);
            GridView1.DataSource = dsSt2Class;
            GridView1.DataBind();
        }
        finally
        {
            myObjConnection.Close();
        }
    }问题一:为什么gridview永远只显示st1Class=1时的相应项。
问题二:如果要局部刷新gridview要如何写?(有代码最好,没有的话给出参考资料也可以)本人新手,以上代码已写了两天还未成功,请各位帮我看看

解决方案 »

  1.   

    1.page_load时,把gridview的初始绑定代码放在if(!ispostback)里
    2.用个updatepanel
      

  2.   

    问题一、因为你的gridview在page_load时总是被刷新,把page_load中的所有代码,放在 if !ispostback中,就不会被刷新了
    问题二、什么叫局部刷新?
      

  3.   

    没仔细看,是page_load里面没有判断postback了吧
      

  4.   

    把你代码改良一下
     protected void Page_Load(object sender, EventArgs e)
            {
               
                if (!IsPostBack)
                {
                    initControl();
                }        }        void initControl()
            {
                string strConnection = "Provider=MicroSoft.Jet.OleDb.4.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("App_Data/FKJdata.mdb");
                OleDbConnection myObjConnection = new OleDbConnection(strConnection);
                try
                {
                    string queryString = "select GoodsName,St1Class from goodslist where st2Class is null and st3Class is null";
                    OleDbDataAdapter apReturnSt1 = new OleDbDataAdapter(queryString, myObjConnection);
                    DataSet dsSt1Class = new DataSet();
                    apReturnSt1.Fill(dsSt1Class);
                    DropDownList1.DataSource = dsSt1Class;
                    DropDownList1.DataBind();
                }
                finally
                {
                    myObjConnection.Close();
                }
            }
            void bindGrid()
            {
                string strConnection = "Provider=MicroSoft.Jet.OleDb.4.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("App_Data/FKJdata.mdb");
                OleDbConnection myObjConnection = new OleDbConnection(strConnection);
                try
                {
                    string queryString = "select GoodsName,St1Class from goodslist where st3Class is null and st2Class is not null and st1Class=?";
                    OleDbCommand myCommand = new OleDbCommand(queryString, myObjConnection);
                    OleDbParameter myParameter = new OleDbParameter("strSt1Class", OleDbType.VarChar, 30);
                    myParameter.Direction = ParameterDirection.Input;
                    myCommand.Parameters.Add(myParameter);
                    myCommand.Parameters["strSt1Class"].Value = DropDownList1.SelectedValue;
                    OleDbDataAdapter apReturnSt2 = new OleDbDataAdapter(myCommand);
                    DataSet dsSt2Class = new DataSet();
                    apReturnSt2.Fill(dsSt2Class);
                    GridView1.DataSource = dsSt2Class;
                    GridView1.DataBind();
                }
                finally
                {
                    myObjConnection.Close();
                }
            }
            protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
            {
                bindGrid();
            }如果局部刷新,放在updatepanel就行了
      

  5.   

    - -!
    果然加了if (!IsPostBack)就可以了。再想问一下,那个updatepanel是放在什么地方?前台还是后台?
      

  6.   

      <asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Inline">
            <ContentTemplate>
     <asp:DropDownList ID="DropDownList1" runat="server" DataTextField="GoodsName" AutoPostBack="true" DataValueField="st1Class" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
            </asp:DropDownList>
            <br />
            <br />
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField HeaderText="分类" DataField="GoodsName" />
                    <asp:BoundField HeaderText="类ID" DataField="st1Class" />
                </Columns>
            </asp:GridView>
    </ContentTemplate>
        </asp:UpdatePanel>
    if(!IsPostBck)
      BindData();
      

  7.   

    updatepanel当然是放前台,还要有scriptmanager
    这个你得去看看ajax
      

  8.   

    我的做法是在gridview外面,放一个同样的dropdownlist(drop2)
       当gridview改变选择的时候,不是从girdview里面这个dropdownlsis(drop1)来读值(因为他一直
       都会是默值也就是楼主所说,显示str1class)[为什么一时忘了]    那我们不从里面读值不就好了.点击完选择把drop2的值重新读进来付给drop1显示  这样就显示str2class了