无法访问列表视图中的控件
错误
对象引用未设置为对象的实例。
的.cs
public void lnkaddtocart_Command(Object sender, CommandEventArgs e)
{
((TextBox)ListView_ProductDetails.FindControl("txtbox_pqty")).Visible = false;
}
的.aspx
<asp:ListView runat="server" ID="ListView_ProductDetails">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<div class="qty">
Qty:
<asp:TextBox ID="txtbox_pqty" Text="1" runat="server"/>
<input type="hidden" name="product_id" size="2" value="41" />
<asp:LinkButton ID="lnkaddtocart" runat="server"
CommandArgument='<%#Eval("pid") %>'
OnCommand="lnkaddtocart_Command"
cssclass="button">
<span>Add to Cart</span>
</asp:LinkButton>
</div>
</ItemTemplate>
</asp:ListView>
答案 0 :(得分:2)
您正在项目模板中使用文本框,因此将有多个文本框(每个项目一个)。话虽如此,Listview将不知道它应该获取哪些文本框。
您必须在单击链接按钮的特定行上查找文本框。
例如:
public void lnkaddtocart_Command(Object sender, CommandEventArgs e)
{
var item = ((Control)sender).NamingContainer as ListViewItem;
if (item != null)
{
((TextBox)item.FindControl("txtbox_pqty")).Visible = false;
}
}
答案 1 :(得分:1)
您需要FindControl
NamingContainer
使用TextBox
ListView
而不是LinkButton's
。var ctrl = (Control) sender;
var lvi = (ListViewItem) ctrl.NamingContainer;
var txt = (TextBox)lvi.FindControl("txtbox_pqty");
txt.Visible = false;
。因此,您可以使用{{1}} ListViewItem
属性查找NamingContainer
。
{{1}}
答案 2 :(得分:1)
除了“Mario”之外,还会在列表视图中添加如下事件:
<asp:ListView runat="server" ID="ListView_ProductDetails" onitemcommand="lnkaddtocart_Command">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<div class="qty">
Qty:
<asp:TextBox ID="txtbox_pqty" text='<%#Eval("pid") %>' runat="server" />
<input type="hidden" name="product_id" size="2" value="41" />
<asp:LinkButton ID="lnkaddtocart" runat="server" text='<%#Eval("pid") %>' CommandArgument='<%#Eval("pid") %>'
cssclass="button"><span>Add to Cart</span></asp:LinkButton>
</div>
</ItemTemplate>
</asp:ListView>
CS:
public void lnkaddtocart_Command(object sender, ListViewCommandEventArgs e)
{
TextBox txt = (TextBox)e.Item.FindControl("txtbox_pqty");
txt.Visible = false;
}
答案 3 :(得分:1)
代码内联:
<asp:ListView runat="server" ID="ListView_ProductDetails" DataSourceID="SqlDataSource1"
OnItemCommand="ListView_ProductDetails_ItemCommand">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<div>
Qty:
<asp:TextBox ID="txtbox_pqty" Text="1" runat="server" />
<input type="hidden" name="product_id" size="2" value="41" />
<asp:LinkButton ID="lnkaddtocart" CommandName="addtocart" runat="server" CommandArgument='<%#Eval("pid") %>'
CssClass="button"><span>Add to Cart</span></asp:LinkButton>
</div>
</ItemTemplate>
</asp:ListView>
代码背后:
protected void ListView_ProductDetails_ItemCommand(object sender, ListViewCommandEventArgs e)
{
if (e.CommandName == "addtocart")
{
((TextBox)e.Item.FindControl("txtbox_pqty")).Visible = false;
}
}
希望这有帮助。
答案 4 :(得分:0)
您正在寻找的控件实际上存在于ListView产品详细信息的重复元素中。要查找控件,您需要遍历控件层次结构。
让我们从你的方法开始。首先要做的是获取包含按钮的ListViewItem的引用。在这些.NET事件签名中,发件人是指引发事件的控件。
public void lnkaddtocart_Command(Object sender, CommandEventArgs e)
{
// Attempt to cast sender to a LinkButton
LinkButton originator = sender as LinkButton;
// Check that we've found it
if ( originator != null )
{
// Now traverse the control hierarchy to get a ListViewItem
var parentItem = originator.Parent as ListViewItem;
if ( parentItem != null
&& parentItem.ItemType == ListViewItemType.DataItem)
{
var textBox = parentItem.FindControl("txtbox_pqty") as TextBox;
if ( textBox != null )
{
textBox.Visible = false;
}
}
}
}