4

リストビューでコントロールにアクセスできません

エラー

オブジェクト参照がオブジェクト インスタンスに設定されていません。

.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>
4

5 に答える 5

2

アイテムテンプレートでテキストボックスを使用しているため、複数のテキストボックスがあります(アイテムごとに1つ)。そうは言っても、リストビューはこれらのテキストボックスのどれをフェッチする必要があるかを知りません。

リンクボタンがクリックされた特定の行のテキストボックスを検索する必要があります。

例えば:

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;
    }
}
于 2012-10-18T07:57:30.537 に答える
2

のではなく、のを使用FindControlする必要があります。したがって、プロパティを使用してを見つけることができます。NamingContainerTextBoxListViewItemListViewLinkButton's NamingContainerListViewItem

var ctrl = (Control) sender;
var lvi = (ListViewItem) ctrl.NamingContainer;
var txt = (TextBox)lvi.FindControl("txtbox_pqty");
txt.Visible = false; 
于 2012-10-18T08:01:29.427 に答える
1

「マリオ」に加えて、次のようにリストビューにイベントを追加します。

<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;
    }
于 2012-10-18T08:12:57.730 に答える
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;
        }
    }

お役に立てれば。

于 2012-10-18T08:20:52.967 に答える
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;
          }
       }
    }
}
于 2012-10-18T08:02:12.567 に答える