我在数据库中有物品。列是ID,Region和Report。我在asp listview中显示所有这些。我需要将这些项目组合在一起,并为每个id显示一行。因此,例如,如果ID = testuser Regions = 1,则2 Reports = A,B
现在,列表显示如下内容:
testuser | 1 |甲
testuser | 1 |乙
testuser | 2 |甲
testuser | 2 |乙
我希望它是:
testuser | 1,2 | A,B
这是前端:
<ItemTemplate>
<tr class="tableRow">
<td class="value">
<asp:Label runat="server" ID="lblCWSID" Text='<%# Eval("CwsId") %>'></asp:Label>
</td>
<td class="value">
<asp:Label ID="lblRegion" runat="server" Text='<%# Eval("Regions") %>'></asp:Label>
</td>
<td class="value" style="width: 70px">
<asp:Label ID="lblReport" runat="server" Text='<%# Eval("Reports") %>'></asp:Label>
</td>
<td class="value" style="width: 50px">
<asp:ImageButton ID="btnEdit" runat="server" ImageUrl="~/App_Themes/Default/Images/edit-icon.png"
OnCommand="btnEdit_User" CommandArgument='<%# Eval("CWSID") %>' Height="20px"
Width="20px" />
<asp:ImageButton ID="btnDelete" runat="server" ImageUrl="~/App_Themes/Default/Images/remove-icon.png"
OnCommand="btnDelete_User" CommandArgument='<%# Eval("CWSID") %>' Height="20px"
Width="20px" />
</td>
</tr>
</ItemTemplate>
这是后端:
/// <summary>
/// Add a user to the list and then rebind
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbSaveUser_Click(object sender, CommandEventArgs e)
{
List<string> selectedRegions = RegionsCheckBox.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
List<string> selectedReports = ReportsCheckBox.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
try
{
if (String.IsNullOrWhiteSpace(txtCWSID.Text))
{
this.lblError.Text = "Please enter a valid CWS ID";
return;
}
if (Common.GetUserCwsId() == txtCWSID.Text.Trim())
{
this.lblError.Text = "It would not be a good idea to block yourself from the site";
return;
}
ReportPermissionsFactory.DeleteReportPermissionUser(txtCWSID.Text, Common.GetConnectionString());
foreach (string Region in selectedRegions)
{
foreach (string Report in selectedReports)
{
ReportPermissionsFactory.InsUpdReportPermissions(txtCWSID.Text.Trim(),Region, Report, Common.GetConnectionString());
}
}
txtCWSID.Text = String.Empty;
BindList();
}
catch (Exception ex)
{
Logger.HandleException(Common.GetUserCwsId(), Projects.GlobalSizingTool, "ReportPermissionsUsers", "lbAddUser_Click", ex, Common.GetConnectionString());
this.lblError.Text = "There was an error completing your request. Please try again.";
}
}
以下是数据的加载方式:
internal static List<ReportPermissions> LoadData(string connectionString, bool refresh = false)
{
string cacheItem = "ReportPermissionsFactory";
ObjectCache cache = MemoryCache.Default;
if (refresh)
{
cache.Remove(cacheItem);
}
List<ReportPermissions> l = cache[cacheItem] as List<ReportPermissions>;
if (l == null || l.Count == 0)
{
l = new List<ReportPermissions>();
Database db = DatabaseFactory.CreateDatabase(connectionString);
DbCommand wrapper = db.GetStoredProcCommand("usp_GetReportPermissionsUsers");
IDataReader reader = db.ExecuteReader(wrapper);
using (wrapper)
{
using (reader)
{
while (reader.Read())
{
ReportPermissions obj = new ReportPermissions();
obj.CwsId= SizingDBLayer.Utilities.GetDBFieldString(reader["CwsId"]);
obj.Regions = SizingDBLayer.Utilities.GetDBFieldString(reader["RegionCode"]);
obj.Reports = SizingDBLayer.Utilities.GetDBFieldString(reader["Reports"]);
l.Add(obj);
}
}
}
cache.Add(cacheItem, l, new DateTimeOffset(DateTime.Now.AddMinutes(5)));
}
return l;
}
答案 0 :(得分:1)
我会创建一个新类(甚至是一个匿名对象)来保存Id以及Regions
和Reports
的CSV。以与您正在执行的方式相同的方式获取数据,但是按CwsId
对其进行分组,并构建新类的新列表。类似的东西:
public class ReportPermissionsById
{
public int CwsId { get; set; }
public string Regions { get; set; }
public string Reports { get; set; }
}
public void BindList()
{
var list = LoadData(connString);
var reportPermissionsById = list
.GroupBy(r => r.CwsId)
.Select(r =>
new ReportPermissionsById
{
CwsId = r.Key,
Regions = string.Join(",", r.Select(d => d.Regions)),
Reports = string.Join(",", r.Select(d => d.Reports)),
}
);
//Use reportPermissionsById to bind your ListView
}
答案 1 :(得分:0)
以下是最终的工作方式:
List<ReportPermissions> finalizedItems = new List<ReportPermissions>();
foreach (ReportPermissions rp in l)
{
//Check to see if record for this user exists
if (!finalizedItems.Any(x => x.CwsId == rp.CwsId))
{
// if it doesn't exist, get it
ReportPermissions perm = new ReportPermissions();
perm.CwsId = rp.CwsId;
perm.Reports = string.Join(",", l.Where(x => x.CwsId == rp.CwsId).Select(x => x.Reports).Distinct());
perm.Regions = string.Join(",", l.Where(x => x.CwsId == rp.CwsId).Select(x => x.Regions).Distinct());
finalizedItems.Add(perm);
}
}
l= finalizedItems;