将asp.net转发器中的重复数据与来自访问数据库的数据合并

时间:2018-02-05 20:41:27

标签: c# asp.net ms-access

我正在尝试合并转发器中的数据,以便所有具有相同“项目名称”和时间的配置文件一次性列在该项目下。 目前,数据显示如下:

  

9:30项目名称

     

个人资料1

     

9:30项目名称

     

个人资料2

但我的目标是将数据显示为:

  

9:30项目名称

     

个人资料1

     

个人资料2

Link to how the html is currently laid out

ASPX文件:

<asp:Repeater ID="rptAgenda" runat="server">
    <ItemTemplate>
        <div class="agenda_card"/>
        <div class="time"><%#Eval("valuefield")%></div>
        <div class="title"><%#Eval("Product")%></div>
        <%#Eval("details")%>
        <a href="#" class="profile_outer">
        <div style="background-image:url('<%#"/photo/" + Eval("photo").ToString()%>');" ></div>
        <%# Eval("type") %></br><b><%#Eval("Name")%>&nbsp;<%#Eval("lastname")%>,&nbsp;<%#Eval("jobtitle")%>
        ><%#Eval("subcompany")%>,&nbsp;<%#Eval("country")%>
        </div>
    </ItemTemplate>
    </asp:Repeater>

C#FILE:

public partial class agenda_code : System.Web.UI.Page
{
  OleDbCommand cmd;
  OleDbConnection con;
  protected void Page_Load(object sender, EventArgs e)
  {
      string dbPath = Server.MapPath("~") + "\\Database\\maindb.accdb";
      con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath + ";Persist Security Info=False;");

      fillAgenda();
  }

  private void fillAgenda()
  {
      string query = "Select listRecipients.valuefield, listRecipients.Product, listRecipients.type, listRecipients.details, Subscribers.Name, Subscribers.lastname, Subscribers.jobtitle, Subscribers.subcompany, Subscribers.country, Subscribers.photo, Subscribers.ContactBio FROM listRecipients ";
      query += "LEFT JOIN Subscribers ON listRecipients.idEmail=Subscribers.idEmail ";
      query += "Where idList=2830 AND (type <> 'Delegate' AND type <>'Sponsor') order by valuefield";

      OleDbDataAdapter adp = new OleDbDataAdapter(query, con);
      System.Data.DataSet ds = new System.Data.DataSet();
      adp.Fill(ds);
      rptAgenda.DataSource = ds;
      rptAgenda.DataBind();
  }
}

希望我不会太模糊,但任何回应都会非常感激:)

1 个答案:

答案 0 :(得分:0)

我会在下面完成。

  1. 创建模型
  2. 调用数据库,返回IEnumerable<Model>
  3. 然后我会过滤数据集
  4. 将过滤后的内容绑定到转发器
  5. 本质上,您将拥有一个简单的对象,将返回未过滤的结果集。然后使用Linq消毒,分组或任何您想要实现的目标。

    var collection = dbContext.GetSample();
    var filter = collection.Where(sample => sample.Item == "Data");
    
    rptSample.DataSource = filter;
    rptSample.Bind();
    

    您需要使用正确的Linq查询来获得数据结果。但是,您可以通过数据库中更好的数据集实现此目的。然后你可以简单地绑定,但如果没有结构或理解你的数据那将是我推荐的两种方法。

    <强>更新

    例如,您将创建一个与您的业务逻辑相关的对象。

    public class Product
    {
         public int Id { get; set; }
         public string Name { get; set; }
         public string Description { get; set; }
    }
    

    所以你会从数据库中提取模型。我已将其抽象出来,以反映数据库调用。但这就是所有这些逻辑正在做的事情。

    public IEnumerable<Product> GetAllProducts()
    {
         using(var context = factory.Create())
              yield return context.RetrieveAllProducts();
    }
    

    因此,我们在类中有一个方法来检索我们的产品。在页面加载中,您将执行以下操作:

    var products = productService.GetAllProducts().Where(product => product.Name.Contains("box"));
    

    请注意,contains不区分大小写,不是理想的,但这是一个示例。所以,我打电话给我们所有的产品,只想要一个名字包含盒子的产品。所以,现在我将它们放入一个控件中。

    rptProducts.DataSource = products;
    rptProducts.DataBind();
    

    因此模型代表我们的对象,我们使用控件将所需内容反映到我们的页面。这有一些好处,主要是您有一个模型来反映您的业务逻辑。您还可以获得一次拉动对象,然后缓存,然后在其他地方使用的好处。缺点确实存在,但您经常可以克服,只需找到适合您应用的正确用法。