ASP.NET框架下TextBox展示Access数据库多条记录仅显示最后一条问题
问题根因
你页面仅声明了4个固定的TextBox控件,循环读取每条数据时对TextBox的Text属性赋值都会覆盖上一次的内容,最终页面只会保留最后一次赋值的记录,和数据库读取逻辑无关。同时你的原有代码存在冗余逻辑:外层for计数循环完全多余,OleDbDataReader的Read()方法会自动遍历所有匹配记录,不需要额外通过count值循环控制。
最优解决方案:使用Repeater列表控件绑定数据
ASP.NET的Repeater控件专为重复结构的列表数据渲染设计,无需手动控制控件生成,代码维护成本更低。
前端替换代码
<div> <asp:Repeater ID="rpt_JobList" runat="server"> <ItemTemplate> <ul style="list-style-type:none"> <li> <asp:TextBox ID="txt_cname" runat="server" BorderStyle="None" Text='<%# Eval("cmp_name") %>'></asp:TextBox> </li> <li> <asp:TextBox ID="txt_city" runat="server" BorderStyle="None" Text='<%# Eval("cmp_city") %>'></asp:TextBox> </li> <li> <asp:TextBox ID="txt_cstate" runat="server" BorderStyle="None" Text='<%# Eval("cmp_state") %>'></asp:TextBox> </li> <li> <asp:TextBox ID="txt_cjob" runat="server" BorderStyle="None" Text='<%# Eval("job_name") %>'></asp:TextBox> </li> <hr /> </ul> </ItemTemplate> </asp:Repeater> </div>
后台替换代码
con.Open(); // 按需查询字段,避免select * 浪费性能 OleDbCommand md = new OleDbCommand("select cmp_name,cmp_city,cmp_state,job_name from tbl_cmpjobdet", con); OleDbDataAdapter da = new OleDbDataAdapter(md); DataTable dtJob = new DataTable(); da.Fill(dtJob); // 直接绑定到Repeater控件,自动生成所有记录的对应控件 rpt_JobList.DataSource = dtJob; rpt_JobList.DataBind(); con.Close(); // 可选:无数据时的提示逻辑 if(dtJob.Rows.Count == 0) { // 自行添加无岗位的提示逻辑 }
备选方案:动态生成控件(不推荐,仅适合特殊场景)
如果不想引入Repeater控件,可以在循环读取数据时动态生成对应的TextBox添加到页面容器,不要复用固定的4个控件:
- 前端先添加一个容器控件:
<div> <asp:PlaceHolder ID="plh_JobContainer" runat="server"></asp:PlaceHolder> </div>
- 后台逻辑:
con.Open(); OleDbCommand md = new OleDbCommand("select cmp_name,cmp_city,cmp_state,job_name from tbl_cmpjobdet", con); OleDbDataReader dr = md.ExecuteReader(); while(dr.Read()) { // 每条记录单独生成一组控件 TextBox txt_cname = new TextBox(); txt_cname.BorderStyle = BorderStyle.None; txt_cname.Text = dr["cmp_name"].ToString(); TextBox txt_city = new TextBox(); txt_city.BorderStyle = BorderStyle.None; txt_city.Text = dr["cmp_city"].ToString(); TextBox txt_cstate = new TextBox(); txt_cstate.BorderStyle = BorderStyle.None; txt_cstate.Text = dr["cmp_state"].ToString(); TextBox txt_cjob = new TextBox(); txt_cjob.BorderStyle = BorderStyle.None; txt_cjob.Text = dr["job_name"].ToString(); // 组装结构添加到容器 plh_JobContainer.Controls.Add(new LiteralControl("<ul style='list-style-type:none'><li>")); plh_JobContainer.Controls.Add(txt_cname); plh_JobContainer.Controls.Add(new LiteralControl("</li><li>")); plh_JobContainer.Controls.Add(txt_city); plh_JobContainer.Controls.Add(new LiteralControl("</li><li>")); plh_JobContainer.Controls.Add(txt_cstate); plh_JobContainer.Controls.Add(new LiteralControl("</li><li>")); plh_JobContainer.Controls.Add(txt_cjob); plh_JobContainer.Controls.Add(new LiteralControl("</li><hr/></ul>")); } dr.Close(); con.Close();
内容的提问来源于stack exchange,提问作者sweet
相关产品推荐
相关产品推荐

