如何从 SQL 中检索多个值到标签

How to retrieve multiple values from SQL to label

我想从我的 SQL 数据库中检索多个值到单个 aspx 页面上的多个标签。现在发生的事情是,我成功地从第一行中检索了值,但是当涉及到第二行时,它会不断重复第一行中的值。

这是我用来 select 来自数据库的值的代码。任何人都可以帮我解决这个问题以检索其他行吗?

页面隐藏代码:

public partial class filmes : System.Web.UI.Page
{
    string strConnString = ConfigurationManager.ConnectionStrings["ENTDB"].ConnectionString;
    string str;
    SqlCommand com;
    protected void Page_Load(object sender, EventArgs e)
    {

        SqlConnection con = new SqlConnection(strConnString);
        con.Open();
        str = "select * from FilmesSeries order by IDFilmesSeries desc";
        com = new SqlCommand(str, con);
        SqlDataReader reader = com.ExecuteReader();

        int ID=1;
        while (reader.Read())
        {
           ID++;
           Label tituloControl= (Label) Page.FindControl("Titulo"+ID);
           if(tituloControl!=null) 
           {
              tituloControl.ID=" Titulo"+ID;           
              tituloControl.Text= reader["Titulo"].ToString();
           } 

           Label GeneroControl= (Label) Page.FindControl("Genero"+ID);
           if(GeneroControl!=null) 
           {
              GeneroControl.ID=" Genero"+ID;           
              GeneroControl.Text= reader["NomeGenero"].ToString();
           }
        }

        reader.Close();
        con.Close();

    }
}

filmes.aspx 页数:

 <div class="row">
        <div class="col-md-5">
            <asp:Label id="Titulo1" runat="server" />
            <asp:Label id="Genero1" runat="server" />
        </div>
    </div>

    <hr>

    <div class="row">
        <div class="col-md-5">
            <asp:Label id="Titulo2" runat="server" />
            <asp:Label id="Genero2" runat="server" />
        </div>
    </div>

首先,您需要获得要分配给的控件的正确索引:

int i = 1;
while (reader.Read())
{
    ...
    i++;
}

那么您需要从页面中检索这些控件:

int i = 1;
while (reader.Read())
{
    Label titleLabel = (Label)this.FindControl("Titulo" + i);
    Label genreLabel = (Label)this.FindControl("NomeGenero" + i);
    ...
    i++;
}

最后赋值

int i = 1;
while (reader.Read())
{
    Label titleLabel = (Label)this.FindControl("Titulo" + i);
    Label genreLabel = (Label)this.FindControl("NomeGenero" + i);
    titleLabel.Text = reader["Titulo"].ToString();
    genreLabel.Text = reader["NomeGenero"].ToString();
    i++;
}

请注意,如果您在数据库中说了 10 个项目,而页面上只有 9 对标签(即 Titulo9 是最后一个,没有 Titulo10),代码上面会失败,所以一定要做一些错误处理。

有一些优化方法:

  1. 将你所有的标签放入一个数组中(确保保持正确的顺序),然​​后你就可以titleLabels[i]
  2. 有一个中继器或一个网格视图,它代表您的实体列表,并定义带有必要标签的模板。然后您可以将数据从您的数据库绑定到它们,这将导致更漂亮、更易于维护的解决方案,并且更不容易出错。不过这确实是一个单独的主题,不太适合这个问题,请在线查找教程。

如果您想显示每行的所有值并将它们分配到标签中。您可以为每一行动态创建这些标签并将它们分配给页面:

int ID=1;
while (reader.Read())
{
   ID++;
   Label TituloLabel= new Label();
   TituloLabel.ID=" Titulo"+ID;
   TituloLabel.Text= reader["Titulo"].ToString();

   Label GeneroLabel= new Label();
   GeneroLabel.ID=" Genero"+ID;
   GeneroLabel.Text= reader["NomeGenero"].ToString();

   Page.Controls.Add(TituloLabel);
   Page.Controls.Add(GeneroLabel);
}

[编辑] 将控件绑定到页面上的某个控件。您可以通过 id 获取该控件。例如,假设您有一个 div,例如:

<div id="placeHolder" runat="server"></div>

以下代码只需找到 div:

即可将创建的标签绑定到它
Page.FindControl("placeHolder").Controls.Add(TituloLabel);
Page.FindControl("placeHolder").Controls.Add(GeneroLabel);

[更新] 此代码将有助于为每一行生成标签,但是如果您想要映射之前创建的标签,那么 Andrei 的 方法应该有效!

[编辑] [2]映射到硬编码标签:

int ID = 0;
while (reader.Read())
{
   ID++;
   Label tituloControl= (Label) Page.FindControl("Titulo"+ID);
   if(tituloControl!=null) 
   {         
      tituloControl.Text= reader["Titulo"].ToString();
   } 

   Label GeneroControl= (Label) Page.FindControl("Genero"+ID);
   if(GeneroControl!=null) 
   {       
      GeneroControl.Text= reader["NomeGenero"].ToString();
   }
}