在 ListView 模板字段中定位控件

Locating a control inside ListView template field

我意识到之前可能有人问过这个问题...但是我对此有一个特定的问题...

我的代码

foreach(ListViewItem item in listProducts.Items)
{
DropDownList dropList = listProducts.Items.FindControl("DropDownList1");
int SelectedID = Convert.ToInt32(listProducts.SelectedValue);
}
// now do something with that id...

问题是,一旦 foreach 循环遍历列表视图项目,我就会从下拉列表中丢失所选项目的 ID...

我在 selectedindexchanged 下拉事件中使用这段代码来定位所需的 ID,这样我就可以根据用户从下拉列表中选择的内容向用户显示数据...

所以我的想法是,当用户从下拉列表中选择某项时,我需要获取所选项目的 ID 并在他选择时自动显示产品价格。

有人可以帮我解决这个问题吗?

列表视图:

 <asp:ListView ID="listProducts" runat="server" DataKeyNames="ProductID" OnItemDataBound="listProducts_ItemDataBound" OnItemCommand="listProducts_ItemCommand" OnSelectedIndexChanging="listProducts_SelectedIndexChanging">
                <ItemTemplate>
                     <div class="productoverlay">
                        <div class="col-lg-4 proizvod">
                             <div class="product">
                                 <div class="glow"></div>
                                 <img src='<%# "../productimg/" + Eval("FileName")%>'  alt='<%# Eval("ProductName") %>'/>
                            </div>
                        </div>
                         <div class="col-lg-1 price">
                             <asp:Label ID="lblPrice" runat="server" Text=""></asp:Label>
                         </div>
                         <div class="col-lg-7 pushtop">
                              <h1><%# Eval("ProductName") %></h1>

                             <p>Description: </p>
                             <p><%# Eval("ProductDescription") %></p>
                             <p>Quantity: </p><asp:TextBox ID="txtPackageQuantity" TextMode="Number" runat="server"></asp:TextBox>                        
                             <asp:DropDownList  ID="DropDownList1" runat="server" OnTextChanged="DropDownList1_TextChanged"></asp:DropDownList> 

                             <asp:Button ID="Button1" runat="server" Text="Add to cart"  CommandName="AddToCart" CommandArgument='<%# Eval("ProductID")%>'/>
                             </div>
                     </div>
                </ItemTemplate>
            </asp:ListView>     

这可能适合你

protected void ListView1_SelectedIndexChanging(object sender, ListViewSelectEventArgs e)
        {
            var lw = sender as ListView;
            var ddl = lw.Items[e.NewSelectedIndex].FindControl("DropDownList1") as DropDownList;
            var val = ddl.SelectedValue;
        }

更新: 下拉列表中没有 OnTextChanged="DropDownList1_TextChanged" (如聊天中所述) 如果你不附加到 listview 事件而是附加到 dropwdonwlist 事件,你必须这样做:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var ddl = sender as DropDownList;
            var val = ddl.SelectedValue;
        }

好的,这是列表视图:

<asp:ListView ID="listProducts" runat="server" DataKeyNames="ProductID" OnItemDataBound="listProducts_ItemDataBound" OnItemCommand="listProducts_ItemCommand" OnSelectedIndexChanging="listProducts_SelectedIndexChanging">
            <ItemTemplate>
                 <div class="productoverlay">
                    <div class="col-lg-4 proizvod">
                         <div class="product">
                             <div class="glow"></div>
                             <img src='<%# "../productimg/" + Eval("FileName")%>'  alt='<%# Eval("ProductName") %>'/>
                        </div>
                    </div>
                     <div class="col-lg-1 price">
                         <asp:Label ID="lblPrice" runat="server" Text=""></asp:Label>
                     </div>
                     <div class="col-lg-7 pushtop">
                          <h1><%# Eval("ProductName") %></h1>

                         <p>Description: </p>
                         <p><%# Eval("ProductDescription") %></p>
                         <p>Quantity: </p><asp:TextBox ID="txtPackageQuantity" TextMode="Number" runat="server"></asp:TextBox>                        
                         <asp:DropDownList  ID="DropDownList1" runat="server" OnTextChanged="DropDownList1_TextChanged"></asp:DropDownList> 

                         <asp:Button ID="Button1" runat="server" Text="Add to cart"  CommandName="AddToCart" CommandArgument='<%# Eval("ProductID")%>'/>
                         </div>
                 </div>
            </ItemTemplate>
        </asp:ListView>     

这是您需要的吗?