gpt4 book ai didi

c#.net ListView - 从不同的表中拉回不同的信息

转载 作者:行者123 更新时间:2023-11-30 21:23:46 25 4
gpt4 key购买 nike

我正在使用 c#.net。

我一直在网上四处寻找,找不到任何可以帮助我的东西。

我有一份承包商名单、每日工作时间、每日时段(三个不同的表格)。

  • 第一行 - 包含承包商名字。
  • 第二行 - 无限制 - 包含插槽。

例如

alt text

我以为我可以使用 ListView,但是我在确定代码的放置位置时遇到了问题。

    <asp:ListView ID="contractorListView" runat="server">
<LayoutTemplate>
<table runat="server">
<tr>
<td>Times</td>
// Contractors names pulled from another
<th><asp:PlaceHolder id="itemPlaceholder" runat="server" /></th>
</tr>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>Times pulled from one database table</td>
<td align="left" style="width: 200px;">
// Customers name - attached to correct time
<asp:Label runat="server" Text='<%#Eval("person_name")%>' />
</td>
</tr>
</ItemTemplate>
</asp:ListView>

使用 Linq 模型,因此可以连接到客户的“时段”

            ObjectDataSource contractorDataSource = new ObjectDataSource();
contractorDataSource.SelectMethod = "GetContractorByDateCategory";
contractorDataSource.TypeName = "contractBook.classes.contractorRepository";

contractorListView.DataSource = contractorDataSource;

contractorDataSource.DataBind();
contractorListView.DataBind();

有人有任何想法/例子吗?

在此先感谢您的帮助。

克莱尔

最佳答案

以下是我倾向于解决此类问题的方式:

  • 手动提取您要显示的数据(调用存储库方法,而不是使用 ObjectDataSource 来执行此操作)。为了提高效率,进行一个返回非规范化记录的大查询通常是有意义的,每个记录都包含您需要的所有列(例如 SELECT TimeSlot, CustomerName, ContractorName FROM (joins go here) ... )

  • 创建一个自定义集合类,将数据放入易于数据绑定(bind)的格式中。 “易于数据绑定(bind)”通常意味着数据的组织顺序与您要显示的顺序相同。您可能还需要采取一些技巧,例如,使所有行的长度相同,以便对每行的相同数量的表格单元格进行数据绑定(bind)。

  • 在您的数据绑定(bind)表达式中,将 Container.DataItem 转换为您需要的任何类型,以便提取该类型的属性。这还有一个额外的好处,就是让带有错别字的数据绑定(bind)表达式在编译时失败,而不是等到运行时才发现错误。

  • 对于嵌套,将嵌套模板控件(例如转发器)的 DataSource 属性设置为父 Container.DataItem 的属性

  • 对于标题行,这里有一个技巧:将标题代码直接放入 ItemTemplate,并使用 Container.ItemIndex==0 来知道何时显示标题行。因为只有 Repeater(而不是 ListView)支持 ItemIndex 属性,所以对于大多数只读数据绑定(bind)任务,我倾向于使用 Repeater 而不是 ListView。这就是为什么我在下面的代码示例中将您的 ListView 更改为使用 Repeater。可以通过将 Index 或 RowNumber 属性添加到上述自定义数据绑定(bind)类来完成同样的事情,但这更难。

一般的想法是,您希望将尽可能多的智能从您的数据绑定(bind)代码中推送到您的页面(或代码隐藏)代码中的实际方法中,这样更容易编写和调试。

这是一个工作示例(模拟了您的类和存储库类),让您了解我在说什么。您应该能够根据自己的情况进行调整。

<%@ Page Language="C#"%>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Linq" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public class Person // replace with your class
{
public string person_name {get; set;}
}
public class Repository // replace with your class
{
public static IEnumerable<Record> GetCustomerByDateCategory()
{
// fake some data
return new Record[]
{
new Record { Time = new DateTime(2000, 1, 1, 8, 0, 0), Contractor = new Person {person_name = "Joe the Plumber"}, Customer = new Person {person_name = "Joe Smith"} },
new Record { Time = new DateTime(2000, 1, 1, 8, 30, 0), Contractor = new Person {person_name = "Bob Vila"}, Customer = new Person {person_name = "Frank Johnson"} },
new Record { Time = new DateTime(2000, 1, 1, 8, 30, 0), Contractor = new Person {person_name = "Mr. Clean"}, Customer = new Person {person_name = "Elliott P. Ness"} },
};
}
public class Record // replace this class with your record's class
{
public DateTime Time {get; set;}
public Person Contractor { get; set; }
public Person Customer { get; set; }
}
}

// key = time, value = ordered (by contractor) list of customers in that time slot
public class CustomersByTime : SortedDictionary<DateTime, List<Person>>
{
public List<Person> Contractors { get; set; }

public CustomersByTime (IEnumerable <Repository.Record> records)
{
Contractors = new List<Person>();
foreach (Repository.Record record in records)
{
int contractorIndex = Contractors.FindIndex(p => p.person_name == record.Contractor.person_name);
if (contractorIndex == -1)
{
Contractors.Add(record.Contractor);
contractorIndex = Contractors.Count - 1;
}
List<Person> customerList;
if (!this.TryGetValue(record.Time, out customerList))
{
customerList = new List<Person>();
this.Add(record.Time, customerList);
}
while (customerList.Count < contractorIndex)
customerList.Add (null); // fill in blanks if needed
customerList.Add (record.Customer); // fill in blanks if needed
}
MakeSameLength();
}
// extend each list to match the longest one. makes databinding easier.
public void MakeSameLength()
{
int max = 0;
foreach (var value in this.Values)
{
if (value.Count > max)
max = value.Count;
}
foreach (var value in this.Values)
{
while (value.Count < max)
value.Add(null);
}
}
}

protected void Page_Load(object sender, EventArgs e)
{
CustomersByTime Customers = new CustomersByTime(Repository.GetCustomerByDateCategory());
CustomerListView.DataSource = Customers;
CustomerListView.DataBind();
}
</script>
<html>
<head>
<style type="text/css">
td, th, table { border:solid 1px black; border-collapse:collapse;}
</style>
</head>
<body>
<asp:Repeater ID="CustomerListView" runat="server">
<HeaderTemplate><table cellpadding="2" cellspacing="2"></HeaderTemplate>
<ItemTemplate>
<asp:Repeater runat="server" visible="<%#Container.ItemIndex==0 %>"
DataSource="<%#((CustomersByTime)(CustomerListView.DataSource)).Contractors %>" >
<HeaderTemplate>
<tr>
<th>Times</th>
</HeaderTemplate>
<ItemTemplate>
<th><%#((Person)Container.DataItem).person_name %></th>
</ItemTemplate>
<FooterTemplate>
</tr>
</FooterTemplate>
</asp:Repeater>
<tr>
<td><%#((KeyValuePair<DateTime, List<Person>>)(Container.DataItem)).Key.ToShortTimeString() %></td>
<asp:Repeater ID="Repeater1" runat="server" DataSource="<%# ((KeyValuePair<DateTime, List<Person>>)(Container.DataItem)).Value %>">
<ItemTemplate>
<td align="left" style="width: 200px;">
<%#Container.DataItem == null ? "" : ((Person)(Container.DataItem)).person_name%>
</td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
</body>
</html>

顺便说一句,如果您正在构建一个全新的应用程序并且有时间学习,我绝对建议您查看 ASP.NET MVC,它的学习曲线并不平凡,但很多 事情变得更简单......特别是这种复杂的数据呈现。

关于c#.net ListView - 从不同的表中拉回不同的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com