在RowDataBound事件中,用SQL语句访问数据库来绑定DropDownList中的数据,假设Gridview有3条记录,请问SQL访问数据库几次?
如果是3次的话,有什么好方法来绑定DropDownList中的数据呢。
如果仅仅为了编辑时选择用的话,在 RowEditing 中去绑定可以吗?

解决方案 »

  1.   

    1. 加入你在 RowDataBound 中每次都去绑,自然是 GridView.Rows.Count 的次数来2. 可以尽在 RowEditing 中绑定,实际上也只要在 EditItemTemplate 中加入 DropDownlist 就可以了3. 另外策略是很多的,比如“缓存”的思想,object DropDownListSource = null; //  RowDataBound(...){
    if(DropDownListSource == null) {
         //  从数据库加载数据
        // ...
    }
    DropDownListInGridViewRow.DataSource = DropDownListSource;
    //...
    }
      

  2.   

    RowEditing 中去绑定可以吗?
    绝对可以,我就是这样子做的,不过在模板列中要放有Dropdownlist。参考代码
     //编辑
        protected void gvWorkTemplate_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.gvWorkTemplate.EditIndex = e.NewEditIndex;
            this.gvWorkTemplate.DataSource = dt;
            this.gvWorkTemplate.DataBind();
            DropDownList dropMemu1 = (DropDownList)gvWorkTemplate.Rows[gvWorkTemplate.EditIndex].FindControl("dropMemu1");//实例化对像
            DropDownList dropMemu2 = (DropDownList)gvWorkTemplate.Rows[gvWorkTemplate.EditIndex].FindControl("dropMemu2");
            DropDownList dropMemu3 = (DropDownList)gvWorkTemplate.Rows[gvWorkTemplate.EditIndex].FindControl("dropMemu3");
            DropDownList dropMemu4 = (DropDownList)gvWorkTemplate.Rows[gvWorkTemplate.EditIndex].FindControl("dropMemu4");
            DataAccess.BindDropDownList(WorkTemplateProc.GetWorkTemplateMemu("00000000", "1"), dropMemu1, "memuName", "memuId");
            dropMemu1.Items.Insert(0, new ListItem("-请选择-", "0"));
      

  3.   

    还有定义一个全局的变量,Datatable
      

  4.   

    在什么方法中帮定都可以;只是你要尽量减少访问数据库的次数;
    定义一个datatable myDataTable =ds.Tables[index];把数据放入缓存:Cache.Insert("dt", myDataTable);从缓存中取得数据: myDataTable =(DataTable)Cache .Get ("dt");然后判断一下maDataTable是否为null 防止缓存过期
      

  5.   

    对RowEditing 中去绑定比较感兴趣。
    我的代码:
      protected void gvMain_RowEditing(object sender, GridViewEditEventArgs e)
     {
             int index = e.NewEditIndex;
            GridViewRow gvr = gvMain.Rows[index];        DropDownList dp = (DropDownList)gvr.FindControl("cmbStation");
            //dp.Items.Clear(); 这里发现dp是NULL,同样的代码在RowUpdating中不是NULL;为什么呢。
            dp.Items.Add(new ListItem("1", "a"));
            dp.Items.Add(new ListItem("2", "b"));
    }
      

  6.   

    我在<ItemTemplate>中放的是Label,Text='<%# Bind("ZNAME"),在<EditItemTemplate>中放的是DropDownList,然后设置它的数据源(这样估计比在RowDataBound中获取数据好些)。
    我的思路是:在没有编辑之前,最好不绑定DropDownList的数据.既然在RowEditing 中去绑定可行,求代码:要求<ItemTemplate>中放的是Label,<EditItemTemplate>中放的是DropDownList。 
      

  7.   

    贴部分代码:

    <asp:TemplateField HeaderText="营业点" SortExpression="ZSTATION_ID">
    <EditItemTemplate>
    <asp:DropDownList ID="cmbStation" runat="server"  Text='<%# Bind("ZSTATION_ID") %>' DataSourceID="dsStation" DataTextField="ZNAME" DataValueField="ZID">
    </asp:DropDownList>
    </EditItemTemplate>
    <ItemStyle HorizontalAlign="Left" Width="100px" />
    <HeaderStyle HorizontalAlign="Left" Width="100px" />
    <ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("STATION_NAME") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>