当我尝试在单个文本框中显示数据库中的 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

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

<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;
            }

        }

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

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

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

首先,更新您的表单以使用 Repeater

<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();

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

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

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

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

        <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();
            }
        }
    }

我们现在得到这个输出:

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

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