获取 DataList 中 TextBox 的值
Get value of a TextBox inside a DataList
我在 ASP.NET 中有一个 DataList,它为我提供了“产品”table 中的产品,因此使用“Eval”语句我分配了产品 ID:
<asp:TextBox ID="idProductoText" runat="server" type="hidden" value='<%# Eval("PRO_ID") %>'></asp:TextBox>
所以在我的 C# 代码中,我需要通过其 ID 获取该文本框的值,例如 idProductText.Text.Trim();
,但由于某种原因它不起作用,有什么解决方案吗?我在下面留下完整的数据列表。
填充数据列表的代码:
public void loadStockProducts()
{
OracleConnection connection = new OracleConnection(with);
OracleCommand command = new OracleCommand("SHOW_PRODUCTS_BUY", connection);
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.Add("registers", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
OracleDataAdapter d = new OracleDataAdapter();
d.SelectCommand = command;
DataTable dt = new DataTable();
d.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
connection.Close();
}
ASP.NET
中的完整数据列表
<asp:DataList ID="DataList1" runat="server">
<ItemTemplate>
<div class="card mb-6" style="max-width: 1400px">
<div class="row g-0">
<div class="col-md-4">
<img
src="../../img/armchair.jpg"
class="img-fluid rounded-start"
alt="product" />
</div>
<div class="col-lg-5 m-4 form-floating">
<div class="card-body">
<!-- THE PRODUCT ID IS HIDDEN, IT WILL ONLY BE USED TO ADD TO CART -->
<asp:TextBox ID="idProductoText" runat="server" type="hidden" value='<%# Eval("PRO_ID") %>'></asp:TextBox>
<asp:Label ID="PRO_NAMELabel" class="card-title" runat="server" Text='<%# Eval("PRO_NAME") %>' Font-Bold="true" Font-Size="Large" Visible="True" />
<br />
<br />
Q<asp:Label ID="PRO_PRICELabel" class="card-text" runat="server" Text='<%# Eval("PRO_PRICE") %>' Font-Size="Large" />
<br />
<br />
<div class="input-group">
<asp:Button ID="moreInformation" runat="server" Text="More Information" class="btn btn-dark m-2" />
<asp:TextBox ID="quantidadBuy" runat="server" type="number" class="form-control m-2" placeholder="Quantity to Buy"></asp:TextBox>
<asp:Button ID="addCart" runat="server" Text="Add to Cart" class="btn btn-success m-2"/ OnClick="addCart_Click"/>
</div>
</div>
</div>
</div>
</div>
<br />
</ItemTemplate>
</asp:DataList>
好的,虽然数据列表中有一些事件,但您可以通过单击您拥有的按钮来抓取并获取您 need/want 的所有信息。
但是,在我们编写该代码之前,我发现您需要一个数据库行 PK id,因此,我建议您删除它:
<!-- THE PRODUCT ID IS HIDDEN, IT WILL ONLY BE USED TO ADD TO CART -->
<asp:TextBox ID="idProductoText" runat="server"
type="hidden" value='<%# Eval("PRO_ID") %>'></asp:TextBox>
假设 PRO_ID 是 PK 数据库 ID,那么我们真的不想在标记中包含该信息 -(甚至隐藏)。
因此,使用所谓的“数据键”功能。您可以保留上面的内容,但将其删除 - 我们真的不需要它。
因此,在数据列表中,添加此设置:
<asp:DataList ID="DataList1" runat="server" DataKeyField = "PRO_ID" >
好的,现在是按钮的点击事件。
假设我们有这个按钮:
<asp:Button ID="cmdView" runat="server" Text="View" CssClass="btn"
OnClick="cmdView_Click" />
后面的代码:
protected void cmdView_Click(object sender, EventArgs e)
{
Button cmdView = sender as Button;
DataListItem gRow = cmdView.NamingContainer as DataListItem;
// get row index
Debug.Print("row click = " + gRow.ItemIndex.ToString());
// get database primary key (data keys)
int? PkID = DataList1.DataKeys[gRow.ItemIndex] as int?;
Debug.Print("Database PK id = " + PkID);
// get value of single control - say hotel label called
Label lHotelName = gRow.FindControl("HotelNameLabel") as Label;
Debug.Print("Hotel name = " + lHotelName.Text);
}
输出:
所以请注意几件事:
我们 grab/get 当前行 - 命名容器。这适用于 Gridview、repeater、listview——几乎所有数据绑定类型的控件。
从那一行,我们可以得到:
行索引 -
从行索引,我们引用数据键。请注意,数据列表仅支持一个数据键,因此在大多数情况下,我们必须这样做 .DataKeys[ some index]["SOME KEY"]
但 datalist 是个例外 - 只有一个键,所以 .DataKeys[some index] 就是你所需要的。
要拉出控件,请使用我上面显示的 .FindControl。
仅供参考:debug.print - 这需要使用 System.Diagnostics;
(我的输出 re-directed 到立即 window)。
我在 ASP.NET 中有一个 DataList,它为我提供了“产品”table 中的产品,因此使用“Eval”语句我分配了产品 ID:
<asp:TextBox ID="idProductoText" runat="server" type="hidden" value='<%# Eval("PRO_ID") %>'></asp:TextBox>
所以在我的 C# 代码中,我需要通过其 ID 获取该文本框的值,例如 idProductText.Text.Trim();
,但由于某种原因它不起作用,有什么解决方案吗?我在下面留下完整的数据列表。
填充数据列表的代码:
public void loadStockProducts()
{
OracleConnection connection = new OracleConnection(with);
OracleCommand command = new OracleCommand("SHOW_PRODUCTS_BUY", connection);
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.Add("registers", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
OracleDataAdapter d = new OracleDataAdapter();
d.SelectCommand = command;
DataTable dt = new DataTable();
d.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
connection.Close();
}
ASP.NET
中的完整数据列表<asp:DataList ID="DataList1" runat="server">
<ItemTemplate>
<div class="card mb-6" style="max-width: 1400px">
<div class="row g-0">
<div class="col-md-4">
<img
src="../../img/armchair.jpg"
class="img-fluid rounded-start"
alt="product" />
</div>
<div class="col-lg-5 m-4 form-floating">
<div class="card-body">
<!-- THE PRODUCT ID IS HIDDEN, IT WILL ONLY BE USED TO ADD TO CART -->
<asp:TextBox ID="idProductoText" runat="server" type="hidden" value='<%# Eval("PRO_ID") %>'></asp:TextBox>
<asp:Label ID="PRO_NAMELabel" class="card-title" runat="server" Text='<%# Eval("PRO_NAME") %>' Font-Bold="true" Font-Size="Large" Visible="True" />
<br />
<br />
Q<asp:Label ID="PRO_PRICELabel" class="card-text" runat="server" Text='<%# Eval("PRO_PRICE") %>' Font-Size="Large" />
<br />
<br />
<div class="input-group">
<asp:Button ID="moreInformation" runat="server" Text="More Information" class="btn btn-dark m-2" />
<asp:TextBox ID="quantidadBuy" runat="server" type="number" class="form-control m-2" placeholder="Quantity to Buy"></asp:TextBox>
<asp:Button ID="addCart" runat="server" Text="Add to Cart" class="btn btn-success m-2"/ OnClick="addCart_Click"/>
</div>
</div>
</div>
</div>
</div>
<br />
</ItemTemplate>
</asp:DataList>
好的,虽然数据列表中有一些事件,但您可以通过单击您拥有的按钮来抓取并获取您 need/want 的所有信息。
但是,在我们编写该代码之前,我发现您需要一个数据库行 PK id,因此,我建议您删除它:
<!-- THE PRODUCT ID IS HIDDEN, IT WILL ONLY BE USED TO ADD TO CART -->
<asp:TextBox ID="idProductoText" runat="server"
type="hidden" value='<%# Eval("PRO_ID") %>'></asp:TextBox>
假设 PRO_ID 是 PK 数据库 ID,那么我们真的不想在标记中包含该信息 -(甚至隐藏)。
因此,使用所谓的“数据键”功能。您可以保留上面的内容,但将其删除 - 我们真的不需要它。
因此,在数据列表中,添加此设置:
<asp:DataList ID="DataList1" runat="server" DataKeyField = "PRO_ID" >
好的,现在是按钮的点击事件。
假设我们有这个按钮:
<asp:Button ID="cmdView" runat="server" Text="View" CssClass="btn"
OnClick="cmdView_Click" />
后面的代码:
protected void cmdView_Click(object sender, EventArgs e)
{
Button cmdView = sender as Button;
DataListItem gRow = cmdView.NamingContainer as DataListItem;
// get row index
Debug.Print("row click = " + gRow.ItemIndex.ToString());
// get database primary key (data keys)
int? PkID = DataList1.DataKeys[gRow.ItemIndex] as int?;
Debug.Print("Database PK id = " + PkID);
// get value of single control - say hotel label called
Label lHotelName = gRow.FindControl("HotelNameLabel") as Label;
Debug.Print("Hotel name = " + lHotelName.Text);
}
输出:
所以请注意几件事:
我们 grab/get 当前行 - 命名容器。这适用于 Gridview、repeater、listview——几乎所有数据绑定类型的控件。
从那一行,我们可以得到:
行索引 -
从行索引,我们引用数据键。请注意,数据列表仅支持一个数据键,因此在大多数情况下,我们必须这样做 .DataKeys[ some index]["SOME KEY"]
但 datalist 是个例外 - 只有一个键,所以 .DataKeys[some index] 就是你所需要的。
要拉出控件,请使用我上面显示的 .FindControl。
仅供参考:debug.print - 这需要使用 System.Diagnostics; (我的输出 re-directed 到立即 window)。