Page_Load加载SQL数据后,能否在DropdownList选中事件复用数据?
如何在SelectedIndexChanged事件中复用已加载的DataTable数据
完全可以复用已加载的数据,不需要再次查询SQL Server。你只需要把Page_Load中加载的DataTable存储到一个页面回发后依然能访问的容器(比如ViewState),之后在SelectedIndexChanged事件中取出并使用即可。
实现步骤
- 在Page_Load中存储DataTable到ViewState
修改Page_Load方法,将加载完成的DataTable存入ViewState,这样页面回发后数据不会丢失:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string mainconn1 = ConfigurationManager.ConnectionStrings["SqlConnection1"].ConnectionString; // 使用using自动释放数据库连接,避免资源泄漏 using (SqlConnection sqlconn1 = new SqlConnection(mainconn1)) { string Sqlquery1 = "SELECT p.[Name], m.machineid,md.MachineNumber, md.HostName FROM [db].[dbo].[Machine] m INNER JOIN MachineDevice md ON md.MachineID = m.MachineID INNER JOIN property p ON m.PropertyID = p.PropertyID WHERE ([status] = '1') AND (md.DateTimeRetired IS NULL) ORDER BY md.MachineNumber"; SqlCommand sqlcomm1 = new SqlCommand(Sqlquery1, sqlconn1); sqlconn1.Open(); SqlDataReader rd1 = sqlcomm1.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(rd1); // 将DataTable存入ViewState ViewState["MachineData"] = dt; } } }
- 在SelectedIndexChanged事件中取出并使用DataTable
从ViewState中取出之前保存的DataTable,根据下拉框的选中值过滤数据后绑定到目标控件:
protected void Ort_SelectedIndexChanged1(object sender, EventArgs e) { // 检查ViewState中是否存在保存的DataTable if (ViewState["MachineData"] is DataTable machineDataTable) { if (Ort.SelectedValue == "Stockholm") { // 使用Linq过滤出对应城市的数据(需引用System.Data.DataSetExtensions命名空间) DataTable filteredData = machineDataTable.AsEnumerable() .Where(row => row.Field<string>("Name") == "Stockholm") .CopyToDataTable(); // 绑定到Machine下拉框 Machine.DataSource = filteredData; Machine.DataTextField = "MachineNumber"; Machine.DataValueField = "MachineNumber"; Machine.DataBind(); Machine.Items.Insert(0, new ListItem("-Select Machine-", "0")); } // 可扩展其他城市的处理逻辑 // else if (Ort.SelectedValue == "其他城市") { ... } } }
补充说明
- ViewState的适用场景:适合存储页面级的小到中等数据量,数据仅在当前页面回发时复用。如果需要跨页面复用数据或数据量较大,可以考虑使用
Session或Cache。 - 数据一致性问题:如果数据库中的数据在用户操作期间可能被修改,复用ViewState中的数据会导致显示过期数据,这种情况下需要重新查询数据库;若数据相对稳定,复用则能有效减少数据库请求。
内容的提问来源于stack exchange,提问作者user17461080
相关产品推荐
相关产品推荐

