C# ASP.net通过从表中预加载数据来加速dropdownlist加载

C# ASP.net通过从表中预加载数据来加速dropdownlist加载,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我有一个网格视图,它使用dropdownlist选择员工ID,但显示姓名 <EditItemTemplate> <asp:DropDownList ID="DropDownList5" runat="server" AppendDataBoundItems="True" DataSourceID="SqlDataSourceEmployees" DataTextField="name" DataValueField="empID" SelectedValue='<%#

我有一个网格视图,它使用dropdownlist选择员工ID,但显示姓名

 <EditItemTemplate>
 <asp:DropDownList ID="DropDownList5" runat="server" AppendDataBoundItems="True" DataSourceID="SqlDataSourceEmployees" DataTextField="name" DataValueField="empID" SelectedValue='<%# Bind("employee") %>'>
                                <asp:ListItem></asp:ListItem>
                            </asp:DropDownList>
  </EditItemTemplate>
但是改变列表的绑定

<EditItemTemplate>
                            <asp:DropDownList ID="DropDownList5" runat="server" AppendDataBoundItems="True" DataSourceID="EmployeesTable" DataTextField="name" DataValueField="empID" SelectedValue='<%# Bind("employee") %>'>
                                <asp:ListItem></asp:ListItem>
                            </asp:DropDownList>
}

这并没有加快速度,我确信DDL仍然从SQL源获取数据(当我试图删除它时,我有一个错误,指出SelevtedValue无效)

所以我试着在编辑事件期间提前一步分配它

 protected void GridView5_RowEditing(object sender, GridViewEditEventArgs e)
{
    ((DropDownList)GridView5.FindControl("DropDownList5")).DataSource = EmployeesTable;
    ((DropDownList)GridView5.FindControl("DropDownList5")).DataBind();


}
但是它没有找到dropdownlist5


编辑:我放弃了。阅读之后,我简单地将SQLDataSource类型更改为DataReader,这确实提高了性能。或者这可能是对我疲惫的大脑的安慰剂效应。

你不能按你现在的方式来做,因为你的employeesTable变量在页面一送达就被销毁了。然后,每次回发都会获得一个新实例。如果列表不是唯一的,则将其存储到缓存对象中。然后还可以为其设置超时

如果它基于页面的数据,则可以将其存储在会话中,这样可以跨页面传输数据,但如果跨用户在会话中存储大量对象,则会降低性能

如果它不是太大,您可以将其存储在ViewState中。然后将其序列化到客户端。缺点是,数据可能会膨胀发送到客户端的HTML

在您的情况下,由于datatable似乎依赖于文本字段,因此最好使用viewstate。但是,在您的例子中,由于您需要知道文本值何时也发生了更改,以便可以否定数据,因此增加了复杂性

下面是ViewState的粗略示例,但您也可以针对会话和缓存进行调整

private string SelectedDepartmentText
{
    get
    {
        if(ViewState["SelectedDepartmentText"] != null)
            return ViewState["SelectedDepartmentText"].ToString();
        else
            return string.Empty;
    }
    set{ViewState["SelectedDepartmentText"] = value;}
}

public DataSet.employeesDataTable EmployeesTable
{
     get
    {
           if(!SelectedDepartmentText.Equals(lblDepartment.Text))
           {
               // if the SelectedDepartmentText isn't the same as the lblDepartment.Text, go fetch it
               DataSetTableAdapters.employeesTableAdapter TA = new DataSetTableAdapters.employeesTableAdapter();
               ViewState["EmployeesTable"] =TA.GetDataByDepartment(lblDepartment.Text);
               // save the lblDepartment.Text value to the viewstate for next time.
               SelectedDepartmentText = lblDepartment.Text;
               return ViewState["EmployeesTable"];
           }
           else
           {
               // let's see if we have something already and return it
               if(ViewState["EmployeesTable"] != null)
                   return (DataSet.employeesDataTable)ViewState["EmployeesTable"];
               else
                {

                // if we don't, let's get it, this also handles an empty string for the                     
                // lblDepartment.Text
            DataSetTableAdapters.employeesTableAdapter TA = new DataSetTableAdapters.employeesTableAdapter();
                        // store it in the viewstate
            ViewState["EmployeesTable"] =TA.GetDataByDepartment(lblDepartment.Text);
                        // and return whatever we got back
            return (DataSet.employeesDataTable)ViewState["EmployeesTable"];
                }
           }
           return null;
    }
    set{ ViewState["EmployeesTable"] = value;}
}

试着把你的数据表放到一个会话中,然后你可以让你的dropdownlist从会话中获取数据。我该怎么做呢?好吧,但我该如何将dropdownlist绑定到EmployeesTable上呢使用DataSourceId是错误的。用于表示数据源控件(如SqlDataSource)的ID。在Codebehind do中:DropDownList5.DataSource=EmployeesTable;DropDownList5.DataBind();它可能正在工作,但我无法将dropdownlist绑定到Employees表。。。(问题更新)
 protected void GridView5_RowEditing(object sender, GridViewEditEventArgs e)
{
    ((DropDownList)GridView5.FindControl("DropDownList5")).DataSource = EmployeesTable;
    ((DropDownList)GridView5.FindControl("DropDownList5")).DataBind();


}
private string SelectedDepartmentText
{
    get
    {
        if(ViewState["SelectedDepartmentText"] != null)
            return ViewState["SelectedDepartmentText"].ToString();
        else
            return string.Empty;
    }
    set{ViewState["SelectedDepartmentText"] = value;}
}

public DataSet.employeesDataTable EmployeesTable
{
     get
    {
           if(!SelectedDepartmentText.Equals(lblDepartment.Text))
           {
               // if the SelectedDepartmentText isn't the same as the lblDepartment.Text, go fetch it
               DataSetTableAdapters.employeesTableAdapter TA = new DataSetTableAdapters.employeesTableAdapter();
               ViewState["EmployeesTable"] =TA.GetDataByDepartment(lblDepartment.Text);
               // save the lblDepartment.Text value to the viewstate for next time.
               SelectedDepartmentText = lblDepartment.Text;
               return ViewState["EmployeesTable"];
           }
           else
           {
               // let's see if we have something already and return it
               if(ViewState["EmployeesTable"] != null)
                   return (DataSet.employeesDataTable)ViewState["EmployeesTable"];
               else
                {

                // if we don't, let's get it, this also handles an empty string for the                     
                // lblDepartment.Text
            DataSetTableAdapters.employeesTableAdapter TA = new DataSetTableAdapters.employeesTableAdapter();
                        // store it in the viewstate
            ViewState["EmployeesTable"] =TA.GetDataByDepartment(lblDepartment.Text);
                        // and return whatever we got back
            return (DataSet.employeesDataTable)ViewState["EmployeesTable"];
                }
           }
           return null;
    }
    set{ ViewState["EmployeesTable"] = value;}
}