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

时间:2016-06-30 11:33:36

标签: c# asp.net tsql ado.net

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

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

页面后面的代码:

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>

2 个答案:

答案 0 :(得分:1)

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

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. 拥有一个转发器或gridview,它代表您的实体列表,并定义带有必要标签的模板。然后,您可以从数据库将数据绑定到它们,这将导致更漂亮和更容易维护的解决方案,并且更不容易出错。然而,这实际上是一个单独的主题,不太适合这个问题,请在线查找教程。

答案 1 :(得分:0)

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

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

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

[编辑] [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();
   }
}

enter image description here