C# ASP.net通过从表中预加载数据来加速dropdownlist加载
我有一个网格视图,它使用dropdownlist选择员工ID,但显示姓名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='<%#
<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;}
}