如何解决数据表中的多个子行,来自asp.net core中sql server的数据
我是 ASP.NET Core 的新手,从事 ASP.NET Core 项目,我需要使用从 sql server 接收数据的数据表。在没有子行的情况下我没有问题,但我必须显示具有多个子行的数据表。我无法显示具有子行的数据表。有很多 ajax 的例子,但我在asp.net core 中找不到任何来自sql server 数据的例子。
如果我们简单谈一下数据库结构,有 2 个表:Order 和 OrderList。
订单:OrderId(PK-int),Customer(string),OrderDate(datetime)
OrderList:KimlikId(PK-int),OrderId(int),Product(string),Color(string),Qntty(int)
Order INNER JOIN OrderList ON Order.OrderId = OrderList.OrderId
我的模型类 OrderList 像这样:
public class OrderList
{
public int OrderId { get; set; }
public int KimlikId { get; set; }
public string Customer { get; set; }
public string OrderDate { get; set; }
public string Product { get; set; }
public string Color { get; set; }
public int Qntty { get; set; }
}
我的控制器类 OrderController 像这样:
public class OrderController : Controller
{
public IEnumerable<OrderList> GetAllOrderList()
{
string connectionString = "My Connection String of sql server";
List<OrderList> sipList = new List<OrderList>();
using (sqlConnection con = new sqlConnection(connectionString))
{
sqlCommand cmd = new sqlCommand("SELECT * FROM Order INNER JOIN OrderList ON Order.OrderId = OrderList.OrderId ORDER BY OrderList.OrderId DESC;",con);
con.open();
sqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
OrderList sip = new OrderList();
sip.OrderId = Convert.ToInt32(dr["OrderId"].ToString());
sip.Customer = dr["Customer"].ToString();
sip.OrderDate = DateTime.Parse(dr["OrderDate"].ToString()).ToString("dd/MM/yyyy");
sip.Product = dr["Product"].ToString();
sip.Color = dr["Color"].ToString();
sip.Qntty = Int32.Parse(dr["Qntty"].ToString());
sipList.Add(sip);
}
con.Close();
}
return sipList;
}
public IActionResult OrderIndex()
{
List<OrderList> sipList = new List<OrderList>();
sipList = GetAllOrderList().ToList();
return View(sipList);
}
}
我的视图是这样的 OrderIndex.cshtml:
@model IEnumerable<AlplerCRM.Models.OrderList>
@{
ViewData["Title"] = "Ordesr";
Layout = "~/Views/Shared/_AnaLayout.cshtml";
}
<table id="example" class="display" style="width:100%">
<thead>
<tr>
<th></th>
<th>OrderId</th>
<th>Customer</th>
<th>OrderDate</th>
</tr>
</thead>
</table>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script>
function format(d) {
return '<table id="childtable" cellpadding="5" cellspacing="0" border="0" style="padding-left: 50px; ">' +
'<tr>' +
'<td>Kimlik No</td>' +
'<td>Product Detail</td>' +
'<td>Product Color</td>' +
'<td>Product Quantity</td>' +
'</tr><tr>' +
'<td>' + d.KimlikId + '</td>' +
'<td>' + d.Product + '</td>' +
'<td>' + d.Color + '</td>' +
'<td>' + d.Qntty + '</td>' +
'</tr>' +
'</table>';
}
$(document).ready(function () {
var table = $("#example").dataTable({
"columns": [
{
"className": 'details-control',"orderable": false,"data": null,"defaultContent": ''
},{ "data": "OrderId" },{ "data": "Customer" },{ "data": "OrderDate" },],"order": [[0,'desc']]
});
});
$('#example tbody').on('click','td.details-control',function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
// This row is already open - close it
row.child.hide();
tr.removeClass('shown');
}
else {
// Open this row
row.child(format(row.data())).show();
tr.addClass('shown');
}
});
</script>
}
解决方法
这是我完成的一个相对简单的方法。
我在“父”行下方使用了一个隐藏行,该行扩展了完整的单元格计数,并通过父单元格中 div 的点击事件显示/隐藏。此 div 包含行的订单 ID 值的属性 data-id
,我用它来创建对子行/隐藏行的引用(例如,detail_151)。当然,这假设父 ID 是唯一的。您可以在构建源 HTML 时添加这些值。
请参阅我的代码片段以获取示例。
// Add the .expand class click events once the page is loaded.
window.onload = e => {
document.querySelectorAll('.expand').forEach(div => {
div.addEventListener('click',e => {
// Toggle the detail display.
const detail = document.querySelectorAll(`#detail_${e.target.getAttribute('data-id')}`)[0];
if (detail.classList.contains('hide'))
detail.classList.remove('hide');
else
detail.classList.add('hide');
});
});
}
body {
font-size: 1em;
}
th,td {
position: relative;
width: 125px;
text-align: left;
}
.expand {
position: absolute;
font-size: 1.4em;
margin-top: -5px;
margin-left: -20px;
color: green;
font-weight: bold;
cursor: pointer;
}
.hide {
display: none;
}
.show {
display: block;
}
<table style="margin-left: auto; margin-right: auto;">
<thead>
<tr>
<th>OrderId</th>
<th>Customer</th>
<th>OrderDate</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div data-id="151" class="expand">+</div>151</td>
<td>Customer21</td>
<td>22.12.2020</td>
</tr>
<tr id="detail_151" class="hide">
<td colspan="3">
<table>
<tr>
<th>Kimlik</th>
<th>Detail</th>
<th>Color</th>
<th>Qty</th>
</tr>
<tr>
<td>2114</td>
<td>Product-14</td>
<td>Green</td>
<td>3</td>
</tr>
<tr>
<td>2358</td>
<td>Product-48</td>
<td>Yellow</td>
<td>2</td>
</tr>
<tr>
<td>2365</td>
<td>Product-08</td>
<td>Red</td>
<td>6</td>
</tr>
<tr>
<td>2371</td>
<td>Product-33</td>
<td>Red</td>
<td>1</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<div data-id="155" class="expand">+</div>155</td>
<td>Customer18</td>
<td>22.12.2020</td>
</tr>
<tr id="detail_155" class="hide">
<td colspan="3">
<table>
<tr>
<th>Kimlik</th>
<th>Detail</th>
<th>Color</th>
<th>Qty</th>
</tr>
<tr>
<td>2019</td>
<td>Product-11</td>
<td>Red</td>
<td>3</td>
</tr>
<tr>
<td>2110</td>
<td>Product-17</td>
<td>Blue</td>
<td>5</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。