获取 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)。