当我尝试在单个文本框中显示数据库中的 3 条记录时,仅显示最后一条记录,而不是 asp.net 空框架中的前两条

Posted

技术标签:

【中文标题】当我尝试在单个文本框中显示数据库中的 3 条记录时,仅显示最后一条记录,而不是 asp.net 空框架中的前两条【英文标题】:when i try to display 3 records from database in single textbox only the last record is displayed and not the first two in asp.net empty framework 【发布时间】:2021-12-11 17:45:11 【问题描述】:

我在 ms 访问中有一个名为 tbl_cmpjobdet 的表,其中存储了作业的详细信息。当用户想要搜索工作时,应向他显示所有可用的工作。我已经使用 oledbdatareader 检索了数据库记录,然后将它们用于循环尝试在文本框中显示此数据。我试图在 4 个文本框中显示 4 件事,即公司名称、城市、州和工作。当程序运行时,值被正确检索,但只有最后一条记录显示在屏幕上,而不是以前的记录。我对所有记录使用相同的四个文本框。我想显示所有记录。这是我正在尝试的代码。这里我声明了文本框

<div>
    <ul style="list-style-type:none">
        <li>
            <asp:TextBox ID="txt_cname" runat="server" BorderStyle="None"></asp:TextBox>
        </li>
        <li>
            <asp:TextBox ID="txt_city" runat="server" BorderStyle="None"></asp:TextBox>
        </li>
        <li>
            <asp:TextBox ID="txt_cstate" runat="server" BorderStyle="None"></asp:TextBox>
        </li>
        <li>
            <asp:TextBox ID="txt_cjob" runat="server" BorderStyle="None"></asp:TextBox>
        </li>
        <hr />
        
    </ul>
        </div>

这是我从数据库中检索记录并在文本框中显示它们的地方

con.Open();
        OleDbCommand cmd = new OleDbCommand("Select count(*) from tbl_cmpjobdet");
        OleDbCommand md = new OleDbCommand("select * from tbl_cmpjobdet");
        cmd.Connection = con;
        md.Connection = con;
        OleDbDataReader dr = md.ExecuteReader();
        int i = Convert.ToInt32(cmd.ExecuteScalar())
 for(int j=0;j<=i;j++)
        
            while(dr.Read())
            
                cname = dr["cmp_name"].ToString();
                city = dr["cmp_city"].ToString();
                state = dr["cmp_state"].ToString();
                jname = dr["job_name"].ToString();

              txt_cname.Text = cname;
                txt_city.Text = city;
                txt_cstate.Text = state;
                txt_cjob.Text = jname;
            

        

现在循环运行正常,值也被传递到文本框,但屏幕上显示的值只是最后一条记录。

【问题讨论】:

您每次都重置文本框的值,而不是追加新值! 是的,但是我如何附加,因为首先显示一个公司的所有详细信息,然后第二个公司的详细信息进来,然后我想单独显示@phuzi 不要只使用“=”,而是使用“+=”。这应该是你追加东西的方式。 您可能需要一个重复器,以便您可以为每条记录重复您的文本框。 @AndrejaZivanovic 我确实尝试过,但是所有公司名称都在该文本框中的一行中出现 【参考方案1】:

听起来您希望能够在自己的一组文本框中显示所有记录。要使用 WebForms 执行此操作,您需要 asp:Repeater

警告 - 我已经有一段时间没有使用 WebForms 了,所以这可能无法开箱即用

首先,更新您的表单以使用中继器

<asp:Repeater runast="server" id="Repeater">
    <ItemTemplate>
        <div>
            <ul style="list-style-type:none">
                <li>
                   <%# Eval("cmp_name") %>
                </li>
                <li>
                   <%# Eval("cmp_city") %>
                </li>
                <li>
                   <%# Eval("cmp_state") %>
                </li>
                <li>
                   <%# Eval("job_name") %>
                </li>
                <hr />                
            </ul>
        </div>
    </ItemTemplate>
</asp:Repeater>

这应该为每条记录重复列表。

现在您需要将数据绑定到中继器

OleDbDataReader dr = md.ExecuteReader();
Repeater.DataSource = dr;
Repeater.DataBind();

【讨论】:

【参考方案2】:

嗯,它的工作原理与 Access 非常相似。但是如果你只是在页面上放置一些文本框,那么你可以设置这些文本框的值。

但是,与 Access 或任何桌面软件一样,这些控件仅显示一个值。

因为你有重复数据?那么最好采用某种支持“多”行数据的网格或表格类控件。

我建议你试试这样的网格视图:

        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>

现在,这是加载上述内容的代码:

    protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)
            LoadGrid();
    

    void LoadGrid()
    
        using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.AccessDB))
        
            using (OleDbCommand cmd = new OleDbCommand("SELECT * fromo tbl_cpmjobdet", conn))
            
                conn.Open();
                GridView1.DataSource = cmd.ExecuteReader();
                GridView1.DataBind();
            
        
    

现在,我没有你的数据,但是这样说:

    protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)
            LoadGrid();
    

    void LoadGrid()
    
        using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.AccessDB))
        
            string strSQL = "SELECT ID, FirstName, LastName, HotelName, Description FROM tblHotels" +
                         "ORDER BY HotelName";

            using (OleDbCommand cmd = new OleDbCommand(strSQL, conn))
            
                conn.Open();
                GridView1.DataSource = cmd.ExecuteReader();
                GridView1.DataBind();
            
        
    

我们现在得到这个作为输出:

所以像文本框这样的控件可以有一个值。

但如果你想要“很多”,那么使用网格控件。如果您不寻找类似输出的网格(表格),也可以使用中继器。

【讨论】:

以上是关于当我尝试在单个文本框中显示数据库中的 3 条记录时,仅显示最后一条记录,而不是 asp.net 空框架中的前两条的主要内容,如果未能解决你的问题,请参考以下文章

在 jquery 数据表中分页后保留文本框值

如何从自动完成文本框中单击名称?

将 dict 元组拆分为数据框中的单个记录

出现在控制源不是 PK 字段的文本框中的记录的主键

如何在 Kivy 的相应文本输入区域中获取输出?

访问 DatePart 函数在表格形式文本框中使用时不会给出正确的周数控制源