gpt4 book ai didi

c# - ASP.NET 应用程序中数据的动态表示

转载 作者:行者123 更新时间:2023-11-30 18:01:52 24 4
gpt4 key购买 nike

我一直在尝试寻找一种动态呈现数据的方式,但一直没有成功。我有一个警报系统(由一个 SQL Server 数据库表组成),然后我希望为该表中的每个(相关)行构建一个要在 ASP 页面中显示的字符串,并插入一个复选框(只是这样我就可以将警报标记为“已读”)。

我已经拥有所有数据(我认为我做的是正确的)但完全无法以我希望的方式在页面上呈现这些数据。

这是 C# 代码:

protected void getAlertas(string matricula)
{
string query = "SELECT * FROM ALERTAS A ";
query += "WHERE EXISTS ( ";
query += "SELECT ID, MATRICULA FROM VEICULOS V WHERE V.MATRICULA = @matricula ";
query += "AND A.IDVEICULO = V.ID ";
query += "AND LIDA = 0)";

SqlCommand comm = new SqlCommand(query, Utils.connectDB());
matricula = matricula.ToString().Replace("\"", "'");
comm.Parameters.AddWithValue("@matricula", matricula);

StringBuilder builder = new StringBuilder();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
StringCollection alertValues = new StringCollection();

StringBuilder HTML = new StringBuilder();

try
{
comm.Connection.Open();
SqlDataReader reader = comm.ExecuteReader();
dt.Load(reader);

foreach (DataRow row in dt.Rows)
{
Label label = new Label();
CheckBox cBox = new CheckBox();

foreach (DataColumn column in dt.Columns)
{
alertValues.Add(row[column].ToString());
}

builder.Append(alertValues[0]); //ID do alerta
builder.Append(":");

builder.Append(matricula);

if (int.Parse(alertValues[10]) == 0) //se motor desligado
{
//string output = "Motor desligado às " + alertValues[3] + "do dia " + alertValues[4];
builder.Append("Motor desligado às ");

}
else if(int.Parse(alertValues[10]) == 1) //se motor ligado
{
//string output = "Motor ligado às " + alertValues[3] + "do dia " + alertValues[4];
builder.Append("Motor ligado às ");
}

builder.Append(alertValues[3]); //hora
builder.Append("do dia ");
builder.Append(alertValues[4]); //data

//HTML.Append(" <div id=\"notifications\" runat=\"server\" class=\"notifications\">");
//HTML.Append(" <div class=\"notificationText\">");
//HTML.Append("<asp:Label ID=\"Label1\" runat=\"server\" Text=\"" + builder.ToString() + "\"></asp:Label>");
//HTML.Append("</div>");
//HTML.Append("<div class=\"setRead\">");
//HTML.Append("<asp:CheckBox ID=\"" + alertValues[0] + "\" runat=\"server\" />");
//HTML.Append("</div>");
//HTML.Append("</div>");


label.Text = builder.ToString();
cBox.ID = alertValues[0];
}
}
finally
{
comm.Connection.Close();
}
}

这里是我要显示数据的 ASP 页面:

<div id="contentRight">
<div id="head">
<p>
<b>Notificações</b></p>
</div>
<div id="notifications" runat="server" class="notifications">
<div class="notificationText">
<asp:Label ID="Label1" runat="server" Text="Nada para mostrar"></asp:Label>
</div>
<div class="setRead">
<asp:CheckBox ID="AlertIDRead" runat="server" />
</div>
</div>
<hr />
<div id="OkBtn" align="center">
<asp:Button ID="OkButton" class="Button" runat="server" Text="Ok" />
</div>
</div>

目标是能够将构造的字符串呈现给页面,并且对于这些行中的每一行,还提供一个 CheckBox,它与 alertID(在 DB 上)具有相同的 ID,只是为了简单起见将它们标记为已读。

我真的迷路了,需要一些帮助。

最佳答案

您可以动态添加项目。然而,这有点痛苦。您必须每次都添加它们,而不仅仅是第一次加载页面时。此外,如果您希望在回发之间保留 View 状态并记住选中了哪些框,则需要在页面生命周期的早期添加它们(例如,在 Page_Init 事件中)。

一种更简单的方法是使用 ListView 等控件。在 ASP.NET 4.0 中,您可以轻松地获得完全符合您需要的控件名称,但您可能会接受 ASP.NET 3.5 中自动生成的控件名称。下面是 ASPX 页面的示例:

<asp:ListView runat="server" ID="listView" DataKeyNames="AlertId">
<LayoutTemplate>
<div id="contentRight">
<div id="head">
<p>
<b>Notificações</b></p>
</div>
<div id="notifications" runat="server" class="notifications">
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</div>
</div>
</LayoutTemplate>
<ItemTemplate>
<div class="notificationText">
<asp:Label ID="Label1" runat="server" Text='<%#Eval("AlertText")%>' />
</div>
<div class="setRead">
<asp:CheckBox ID="AlertChecked" runat="server" />
</div>
</ItemTemplate>
</asp:ListView>
<hr />
<div id="OkBtn" align="center">
<asp:Button ID="OkButton" class="Button" runat="server" Text="Ok" onclick="OkButton_Click" />
</div>
<asp:Label runat="server" ID="lblDisplay" />

下面是一些示例代码隐藏。请注意,我已将数据访问代码替换为硬编码列表。我假设您愿意将其替换为从数据库加载数据所需的代码。

    protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Creates a list of alerts and binds them to the list view.
// You would use your sql data reader here instead. You could convert the data
// into a list or just bind the data reader directly to the list view. If you
// bind the data reader to the list view then be sure to update the Eval statements
// in the list view templates.
var alerts = new[]
{
new { AlertId = 1, AlertText = "This is alert #1."},
new { AlertId = 2, AlertText = "This is the second alert."},
new { AlertId = 3, AlertText = "This is the third alert."},
new { AlertId = 5, AlertText = "This is alert #5."}
};
listView.DataSource = alerts;
listView.DataBind();
}
}

protected void OkButton_Click(object sender, EventArgs e)
{
// get the list of alerts that have been checked
var checkedAlerts = new List<int>();
foreach (var listViewItem in listView.Items)
{
var checkbox = (CheckBox)listViewItem.FindControl("AlertChecked");
if (checkbox.Checked)
{
checkedAlerts.Add((int)listView.DataKeys[listViewItem.DataItemIndex].Value);
}
}
// now do something to record them as read; we'll just display them in a label for this sample.
lblDisplay.Text = "The following alerts were marked read: " + String.Join(",", checkedAlerts);
}

关于c# - ASP.NET 应用程序中数据的动态表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650544/

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