2

ListView に挿入しようとしている情報のプレビューをユーザーに表示しようとしています。ListView の InsertItemTemplate 内のボタンを使用して表示および非表示にしたい 2 つのパネルがあります。

以下の ListView のコードは、説明を目的としたものです。関数は、私が使用している実際のコードです:

<asp:ListView ID="ListView1" runat="server">
    <InsertItemTemplate>

        <asp:Panel ID="pnlInsert" runat="server" Visible="true">
            <asp:Button ID="btnPreview" runat="server" OnClick="showPreview" Text="Preview" />
        </asp:Panel>

        <asp:Panel ID="pnlPreview" runat="server"  Visible="false">
            <p>This is the preview</p>
        </asp:Panel>

    </InsertItemTemplate>
</asp:ListView>


protected void showPreview(object sender, EventArgs e) 
{
    Panel pnlInsert = (Panel)ListView1.FindControl("pnlInsert");
    pnlInsert.Visible = false;
    Panel pnlPreview = (Panel)ListView1.FindControl("pnlPreview");
    pnlPreview.Visible = true;
}

私が得ているエラーは次のとおりです。

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

どんな助けでも大歓迎です。

4

3 に答える 3

0

null 参照の例外は、pnlInsert または plnPreview のいずれかに null が割り当てられたためです。FindControl メソッドが ListView1 で "pnlInsert" または "pnlPreview" コントロールを見つけられなかったことが原因である可能性があります。

また、ListView1 では、最初のパネルの ID が「Panel1」であるため、コード行を変更する必要があります。

Panel pnlInsert = (Panel)ListView1.FindControl("pnlInsert");

Panel pnlInsert = (Panel)ListView1.FindControl("Panel1"); or

マークアップのパネルの ID を「pnlInsert」に変更します。

また、FindControl を処理する際には防御コードを用意することをお勧めします。コードを以下に変更します

 Panel pnlInsert = ListView1.FindControl("pnlInsert") as Panel;

 if(pnlInsert != null)
 {
    pnlInsert.Visible = false;
 }
 else
 {
   // control not found - do something;
 }

 Panel pnlPreview = ListView1.FindControl("pnlPreview") as Panel;

 if(pnlPreview != null)
 {
   pnlPreview.Visible = true;
 }
 else
 {
   // control not found - do something;
 }
于 2012-07-05T11:36:21.897 に答える
0

「pnlInsert」はなく、「パネル 1」があります。

コントロールをパネルにキャストする代わりに、代わりにasキーワードを使用します。いえ

Panel pnlInsert = e.FindControl("pnlInsert") as Panel;
if (pnlInsert != null)
{
    //do something with pnlInsert
}

ListView1.Parent.FindControl("pnlInsert")ListView コントロールの親を探してから、ListView 内のコントロールを探しています。あなたの pnlInsert は ListView の子です。

コードの残りの部分によっては、おそらく代わりにこれを実行できます。

protected void showPreview(object sender, EventArgs e) 
{
    pnlInsert.Visible = false;
    pnlPreview.Visible = true;
}
于 2012-07-05T11:24:35.383 に答える
0

w あなたのコードを見る パネルは ListView1 という名前の ListView 内に存在しますが、ListView1 の Parent.Controls 内のパネルを検索しています。

必要なのは ListView1.FindControl("pnlInsert) & ListView1.FindControl("pnlPreview") です

于 2012-07-05T11:18:07.460 に答える